我想找到附近的所有人,从Firebase数据库中检索一些信息,然后再返回特定子集的编号。在客户端上,数据将在服务器发送响应后从数据库加载,因为我的结果保存在那里而不是由服务器函数直接返回。我这样做,所以在检查完所有可能的人之后,我可以从数据库中将它们检索为有序列表。
我的问题是,在"ready"
的承诺得到解决之前,geoQuery的"key_entered"
函数会被解决:
var onKeyEnteredRegistration = geoQuery.on("key_entered", function(key, location, distance) {
promises.push(new Promise((resolve,reject) => {
var someDatabaseCheck = groupRef.child("path1").once("value"); //Promise
var someDatabaseCheck2 = groupRef.child("path2").once("value"); //Promise
Promise.all([someDatabaseCheck,someDatabaseCheck2]).then((data) => {
if(data[1].val()){
validSuggestions.push(userRef.child("path3").update(myData); //Promise
}
},error => console.error(error));
resolve("Done");
}));
});
var onReady = geoQuery.on("ready", function() {
console.log("GeoQuery rdy");
return Promise.all(promises).then(() => { //Called before everything is added
return Promise.all(validSuggestions).then(() => {
onKeyEnteredRegistration.cancel();
onKeyEnteredRegistration = undefined;
onReady.cancel();
onReady = undefined;
console.log("Returning result");
res.status(200).send(""+validSuggestions.length);
},error => console.error(error));
},error => console.error(error));
});
所以我的下一个想法是使用"key_entered"
触发器来检索必要的数据并将其保存在数组中。稍后在"ready"
中,我迭代数组,使所有魔法发生,在循环之后,我进行Promise.all(...)
调用以确保处理每个数据。
但显然,解决起来并不容易,因为当循环结束时,promises-array
并没有将所有承诺添加到Promise.all(...)
(因此由"key_entered"
调用处理)。
如何使用新方法:
"ready"
查找附近所有人并将其添加到阵列(arr)"key_entered"
- 调用回调新方法会发生什么:
"ready"
查找附近所有人并将其添加到阵列(arr)"ready"
- 调用回调处理此问题的典型方法是什么?我应该在"key_entered"
或{{1}}回调中运行承诺吗?另外,我如何确保我的所有承诺都已得到解决?也许我只是误解了一些关于Promises的基本知识。