Javascript 如何";“控制”;当Firestore.getAll(…承诺)通过拒绝停止时
上下文: 我正在做一个云功能,向多个用户发送推送。我需要恢复每个用户的信息,以了解一些数据,如,姓名,国家等 问题: 实际上,我恢复了用户Id列表,当我得到它时,我创建了一个Javascript 如何";“控制”;当Firestore.getAll(…承诺)通过拒绝停止时,javascript,node.js,firebase,google-cloud-firestore,google-cloud-functions,Javascript,Node.js,Firebase,Google Cloud Firestore,Google Cloud Functions,上下文: 我正在做一个云功能,向多个用户发送推送。我需要恢复每个用户的信息,以了解一些数据,如,姓名,国家等 问题: 实际上,我恢复了用户Id列表,当我得到它时,我创建了一个承诺数组来恢复所有信息: var usersPromises = [] for (var i = 0; i < usersInRange.length; i++) { usersPromises[i] = firestore.collection("users").doc(usersInRange[i]) }
承诺数组
来恢复所有信息:
var usersPromises = []
for (var i = 0; i < usersInRange.length; i++) {
usersPromises[i] = firestore.collection("users").doc(usersInRange[i])
}
这个解决方案实际上几乎一直“很好”地工作。但此时Firestore db有一些不存在的用户或出现了问题,因为方法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{
......
}
})
}
for(var i=0;i{
if(snapshot.exists){
......
var user=snapshot.data()
......
}否则{
......
}
})
}
我认为这不是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”,结果如下所示:
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));
因此,我们只需在不存在的文档上获取未定义的,
,仅此而已。我建议添加catch
,看看是否有任何异常。当我编写测试时,函数被内部函数中的输入错误打断
我希望这会有帮助 我认为这不是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”,结果如下所示:
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));
因此,我们只需在不存在的文档上获取未定义的,
,仅此而已。我建议添加catch
,看看是否有任何异常。当我编写测试时,函数被内部函数中的输入错误打断
我希望这会有帮助 您提到“有点不对劲,因为getAll()方法在完成所有承诺之前就停止了”。您可以共享整个云函数的代码,因为它可能是由另一个问题(承诺未返回)引起的。顺便说一句,请注意,您传递给getAll
的不是承诺,而是DocumentReference
s或ReadOptions
。您提到“有些问题,因为getAll()方法在完成所有承诺之前停止了”。您是否可以共享整个云函数的代码,因为它可能是由其他问题引起的(承诺未返回)。顺便说一句,请注意传递给getAll
的不是承诺,而是DocumentReference
s或ReadOptions
。