【发布时间】:2021-06-30 15:34:47
【问题描述】:
我正在制作一个反应应用程序,用户可以在其中创建自己的个人资料中的一些数据,然后再查看它。我使用 localForage 将这些数据保存在 IndexedDB 中。问题是由于 IndexedDB 的设计,IndexedDB 存储根据域保存数据。我有多个用户登录并创建数据。我正在使用 firebase,我可以使用 onAuthStateChange 方法获取用户电子邮件。我需要为 IndexedDB 中的每个帐户创建一个商店。我试过这样做,但我坚持以正确的方式运行异步和同步代码。这是我创建 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 字符串。
【问题讨论】:
-
同一台机器上有多个用户?
-
是的。我在同一台机器上有多个用户。
-
您需要等待创建实例,直到身份验证状态发生变化。您现在没有在等待。
-
是的。这就是问题所在。我不知道如何在身份验证状态更改之前暂停代码执行。这是我问题的最后一部分 - 我想在 onAuthStateChanged 完成执行后运行 totalCardsData 。这样我就可以获得 userEmail 字符串。
-
您正在尝试静态导出动态值。你不能做这个。您只需从身份验证事件回调处理程序调用 localForage.createInstance。
标签: javascript database firebase asynchronous indexeddb