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

Javascript 如何设置每个用户电子邮件的单个IndexedDb存储,javascript,database,firebase,asynchronous,indexeddb,Javascript,Database,Firebase,Asynchronous,Indexeddb,我正在制作一个react应用程序,用户可以在自己的配置文件中创建一些数据,然后查看。我正在使用LocalFound将此数据保存在IndexedDB中。问题在于IndexedDB的设计,IndexedDB存储根据域保存数据。我有多个用户登录并创建数据。我正在使用firebase,我可以使用onAuthStateChange方法获取用户电子邮件。我需要为IndexedDB中的每个帐户创建一个存储。我尝试过这样做,但我坚持以正确的方式运行异步和同步代码。下面是我创建IndexedDb实例的代码- im

我正在制作一个react应用程序,用户可以在自己的配置文件中创建一些数据,然后查看。我正在使用LocalFound将此数据保存在IndexedDB中。问题在于IndexedDB的设计,IndexedDB存储根据域保存数据。我有多个用户登录并创建数据。我正在使用firebase,我可以使用onAuthStateChange方法获取用户电子邮件。我需要为IndexedDB中的每个帐户创建一个存储。我尝试过这样做,但我坚持以正确的方式运行异步和同步代码。下面是我创建IndexedDb实例的代码-

import localforage from 'localforage';

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

export { totalCardsData };
使用它,我只能创建一个名为“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。这样我就可以获得用户电子邮件字符串。

我建议

  • 将firebase onAuthStateChange(例如:
    module1
    )和localstorage创建逻辑(例如:
    module2
    )分别放在两个不同的模块中,并在父文件中导入
  • 编写一个以userEmail为参数的方法,在
    module2
    中重新运行localstorage实例并导出该方法(例如:
    createLocalStorageInstance
  • 生成自定义事件并从onAuthStateChange发出,在父文件中侦听它,然后从父文件调用
    createLocalStorageInstance

  • 这应该有效。

    同一台机器上有多个用户?是的。我在同一台计算机上有多个用户。您需要等待身份验证状态更改后才能创建实例。你现在不是在等,是的。这就是问题所在。我不知道如何暂停代码执行,直到身份验证状态改变。这是我问题的最后一部分-我想在onAuthStateChanged完成执行后运行totalCardsData。这样我就可以得到userEmail字符串。您正在尝试静态导出一个动态值。你不能这样做。您只需从auth事件回调处理程序调用LocalFower.createInstance。我将我的createLocalInstance包装到一个函数中,并将电子邮件作为该函数的参数。然后导出该函数,返回值为createLocalStorage。所以我并没有完全按照你说的去做,但你的回答给了我一个想法。所以我认为你的答案是正确的。