Firebase 异步/等待查询未按预期工作
2021-04-21
78
嘿伙计们,我对此有点陌生,但我会尽我所能解释它,所以我使用一个函数来返回一个承诺,我的代码看起来像这样
getAccounts(email) {
return new Promise((resolve, reject) => {
usersCollection.where('email', '==', email).where('userType', 'in', ['Admin', 'Superuser'])
.get()
.then(async querySnapshot => {
const accounts = [];
await querySnapshot.forEach(async account => {
let accountData = await account.data();
accountData.id = accountData.userType;
if (accountData.userType === 'Admin') {
const adminObj = new Admin();
const adminData = await adminObj.getAdminDetails();
accountData = { ...accountData, ...adminData };
}
accountData.uid = authId;
await accounts.push(accountData);
});
resolve(accounts);
});
});
}
我目前有两个帐户,一个是管理员,另一个是超级用户,问题是在可以获取 adminData 之前承诺已经解决,可能是什么问题?
1个回答
-
您正在将
await
样式与.then()
混合使用。完全摆脱Promise
和.then
,并坚持使用async
。 -
您不能在
.forEach()
或任何其他 Array 方法(map、filter 等)中使用await
,但您可以在for
循环中使用。 -
accounts.push
是完全同步的,根本不需要await
它。
const getAccounts = async email => {
const querySnapshot = await usersCollection
.where('email', '==', email)
.where('userType', 'in', ['Admin', 'Superuser'])
.get();
const accounts = [];
for( let account of querySnapshot.docs ){
let accountData = await account.data();
accountData.id = accountData.userType;
if (accountData.userType === 'Admin') {
const adminObj = new Admin();
const adminData = await adminObj.getAdminDetails();
accountData = { ...accountData, ...adminData };
}
accountData.uid = authId;
accounts.push(accountData);
}
return accounts;
}
const accounts = await getAccounts("[email protected]");
Jeremy Thille
2021-04-21