上下文:
我正在做一个云功能来向多个用户发送推送。我需要恢复每个用户的信息以了解一些数据,例如姓名、国家/地区等。
问题:
实际上,我恢复了用户 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{
......
}
}
})
这个解决方案
实际上几乎一直“正常”工作。但此时 Firestore 数据库有一些用户不存在或出现问题,因为方法 getAll()
在完成所有 promise 之前停止。我知道是因为没有发送推送,并且在控制台中只是说该方法已完成。
阅读 SO 和文档,我看到,如果某些 promise 被“破坏”, getAll 就会停止。 (全有或全无)
这就是我迷路的地方。我怎样才能“强制”或以其他方式做,只是“跳过”这个无法完成的 promise ?
附注:
我尝试用“for”来做,但它似乎省略了一些 promise :
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));
在我的数据库中,我有“test/test”和“test/doc”文档,但没有“test/test1”,结果如下所示:
所以我们只是在不存在的文档上得到undefined
,仅此而已。我建议添加catch
,看看是否有异常。当我编写测试时,该函数因内部函数中的拼写错误而中断。
希望这会有所帮助!
关于javascript - 当 Firestore.getAll(...promises) 因拒绝而停止时如何 "control",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59785288/