如何在 Firebase Firestore 完成之前暂停 Javascript MAP? Promise、Async/Await 或两者兼有

Posted

技术标签:

【中文标题】如何在 Firebase Firestore 完成之前暂停 Javascript MAP? Promise、Async/Await 或两者兼有【英文标题】:How to pause Javascript MAP until Firebase Firestore is done? Promise, Async/Await or both 【发布时间】:2020-02-23 18:43:14 【问题描述】:

我需要能够映射(或者如果需要,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

【问题讨论】:

【参考方案1】:

删除Promise.all,只删除await for doc in for 循环:

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();
      
  
)();

【讨论】:

以上是关于如何在 Firebase Firestore 完成之前暂停 Javascript MAP? Promise、Async/Await 或两者兼有的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS XCUITest 期间配置 Firebase

如何使用颤振在 Firebase 云 Firestore 中添加多个节点

Firebase 云功能与 Firestore 返回“已超过截止日期”

如何将我的 Firebase 实时数据库转移到 Firebase Cloud Firestore

如何在 Flutter 中使用 Firebase Auth 和 Firestore

如何使用firebase-admin在firestore中将日期保存为时间戳?