开发者问题收集

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