内容:

我正在执行云功能以将推送发送给多个用户。我需要恢复每个用户的信息,以了解一些数据,例如姓名,国家/地区等。

问题:

实际上,我恢复了用户ID的列表,当我得到它时,我创建了一个promises数组来恢复所有信息:

var usersPromises = []
for (var i = 0; i < usersInRange.length; i++) {
   usersPromises[i] = firestore.collection("users").doc(usersInRange[i])
}


然后,我恢复并使用firestore.getAll()发送推送:

firestore.getAll(...usersPromises).then(results => {
   for(snapshot in results){
      if(snapshot.exists){
         ......
         var user = snapshot.data()
         ......
      }else{
         ......
      }
   }
})


实际上,该solution几乎一直都在“正常”运行。但是此时,Firestore数据库中的某些用户不存在或出了点问题,因为getAll()方法在完成所有承诺之前就停止了。我知道这是因为没有发送推送,并且在控制台中只需说该方法已完成即可。

阅读SO和文档,我发现,如果某些承诺被“破坏”,则getAll将停止。 (全部或全部)

这是我迷路的地方。我如何“强迫”或以另一种方式仅仅“跳跃”这一无法完成的承诺?

附言:

我尝试使用“ for”,但似乎省略了一些承诺:

for (var i = 0; i < usersPromises.length; i++) {
   usersPromises[i]
      .get()
      .then(snapshot => {
        if(snapshot.exists){
           ......
           var user = snapshot.data()
           ......
        }else{
           ......
        }
      })
}

最佳答案

我认为这不是getAll的问题。我已经测试过了:

const firestore = new Firestore();

let doc = []
doc[0] = firestore.doc('test/test');
doc[1] = firestore.doc('test/test1');
doc[2] = firestore.doc('test/doc');

firestore.getAll(...doc)
.then(result=> result.forEach(doc => console.log(doc._fieldsProto)))
.catch(err=>console.log(err));


在我的数据库中,我有“测试/测试”和“测试/文档”文档,但没有“测试/测试1”,结果如下所示:

javascript - Firestore.getAll(…promises)通过拒绝停止时如何“控制”-LMLPHP

因此,我们仅在不存在的文档上得到undefined,仅此而已。我建议添加catch并查看是否有任何异常。当我编写测试时,该函数被内部函数中的拼写错误中断。

我希望这个能帮上忙!

10-06 07:47