首页 > 解决方案 > 如何在 Firebase Firestore 完成之前暂停 Javascript MAP?Promise、Async/Await 或两者兼有

问题描述

我需要能够在一组帐户上映射(或者如果需要,foreach)。我想在更新或将其添加为新帐户之前验证该帐户是否存在于 Firebase Firestore 中。问题是地图继续运行,然后 Firebase Firestore 功能最终运行。我尝试将 Firestore 包装在它自己的承诺中,但它没有用。我需要一切正常运行。我知道我的 Promise 和/或 Async/Await 在错误的地方。我仍在学习如何正确使用 Promise 和 async/await。

    let db = admin.firestore();

    (async () => {
        const accountInfo = [{ accountNumber: 'a' }, { accountNumber: 'b' }, { accountNumber: 'c' }];
        for (let i = 0, j = accountInfo.length; i < j; i++) {
            console.log("i: ", i);
            await Promise.all(
                accountInfo
                    .map(account => {

                        const {accountNumber} = account;
                        console.log(accountNumber);

                        // Firebase - Firestore
                        let docRef = db.collection('accounts').doc(accountNumber);

                        docRef.get().then(function (doc) {

                            console.log("doc.exists ", doc.exists)

                            if (doc.exists) {
                               firebaseUpate();
                            }
                            else {
                               firebaseAdd();
                            }
                        })
                    })
            )
        }
    })();

我得到的结果:

[0] i:  0
[0] a
[0] b
[0] c
[0] i:  1
[0] a
[0] b
[0] c
[0] i:  2
[0] a
[0] b
[0] c
[0] doc.exists  false
[0] doc.exists  false
[0] doc.exists  false
[0] doc.exists  false
[0] doc.exists  false
[0] doc.exists  false
[0] doc.exists  false
[0] doc.exists  false
[0] doc.exists  false

我需要的结果: Console.log()

[0] i:  0
[0] a
[0] doc.exists  false
[0] i:  1
[0] b
[0] doc.exists  false
[0] i:  2
[0] c
[0] doc.exists  false

标签: javascriptnode.jsfirebasegoogle-cloud-firestore

解决方案


删除Promise.all, 并且只是awaitfor docinfor循环:

let db = admin.firestore();

(async () => {
  const accountInfo = [
    { accountNumber: "a" },
    { accountNumber: "b" },
    { accountNumber: "c" }
  ];
  for (let i = 0, j = accountInfo.length; i < j; i++) {
      console.log("i: ", i);
      const { accountNumber } = accountInfo[i];
      console.log(accountNumber);

      // Firebase - Firestore
      let docRef = db.collection("accounts").doc(accountNumber);

      const doc = await docRef.get();

      console.log("doc.exists ", doc.exists);

      if (doc.exists) {
        firebaseUpate();
      } else {
        firebaseAdd();
      }
  }
})();

推荐阅读