Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何";“控制”;当Firestore.getAll(…承诺)通过拒绝停止时_Javascript_Node.js_Firebase_Google Cloud Firestore_Google Cloud Functions - Fatal编程技术网

Javascript 如何";“控制”;当Firestore.getAll(…承诺)通过拒绝停止时

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]) }

上下文:

我正在做一个云功能,向多个用户发送推送。我需要恢复每个用户的信息,以了解一些数据,如,姓名,国家等

问题:

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

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