如何为每个用户电子邮件设置单独的 IndexedDb 存储

How to set individual IndexedDb storage per user email

我正在制作一个 React 应用程序,用户可以在其中在自己的个人资料中创建一些数据,然后再查看。我使用 localForage 将这些数据保存在 IndexedDB 中。问题出在IndexedDB的设计上,IndexedDB store是按照domain来保存数据的。我有多个用户登录并创建数据。我正在使用 firebase,我可以使用 onAuthStateChange 方法获取用户电子邮件。我需要为 IndexedDB 中的每个帐户创建一个商店。我尝试这样做,但我坚持以正确的方式使用 运行ning 异步和同步代码。这是我创建 IndexedDb 实例的代码 -

import localforage from 'localforage';

let totalCardsData = localforage.createInstance({
    name: 'totalCardsData',
    storeName: 'cards',
});

export { totalCardsData };

使用它我只能创建 1 个名为 'totalCardsData' 的商店。在这里,我尝试为对象创建一个动态名称。

import firebase from 'firebase/app';
import localforage from 'localforage';
import initFirebase from '../utils/auth/initFirebase';

initFirebase();

let userEmail = '';
let totalCardsData;

firebase.auth().onAuthStateChanged(user => {
    if (user) {
        userEmail = user.email;
    }
});

totalCardsData = localforage.createInstance({
    // name: 'totalCardsData',
    name: `${userEmail}`,
    storeName: 'cards',
});

export { totalCardsData };

onAuthStateChanged 是一个异步方法。所以我得到了 ${userEmail} 的空字符串,因为 onAuthStateChanged 在其余代码执行完毕后完成了它的执行。

我想在 onAuthStateChanged 完成执行后 运行 totalCardsData。这样我就可以获得 userEmail 字符串。

我建议

  1. 在两个不同的模块中分离 firebase onAuthStateChange(例如:module1)和本地存储创建逻辑(例如:module2),在父文件中导入它们。
  2. 编写一个方法,将 userEmail 作为参数并在 module2 中重新调整 localstorage 实例并导出该方法(例如:createLocalStorageInstance)。
  3. 生成自定义事件并从 onAuthStateChange 发出它并在父文件中收听它并从那里调用 createLocalStorageInstance

这应该有效。