GeoFire:等待待处理的承诺

时间:2018-05-04 16:41:10

标签: javascript node.js firebase promise geofire

我想找到附近的所有人,从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"调用处理)。

如何使用新方法:

  1. 通过"ready"查找附近所有人并将其添加到阵列(arr)
  2. "key_entered" - 调用回调
  3. 迭代arr
  4. 检查人是否符合要求(承诺A)
  5. 承诺A做出决议并将此人写入(或不写入)数据库
  6. 迭代循环结束
  7. 返回最终列表并关闭功能
  8. 新方法会发生什么:

    1. 通过"ready"查找附近所有人并将其添加到阵列(arr)
    2. "ready" - 调用回调
    3. 迭代arr
    4. 检查人是否符合要求(承诺A)
    5. 迭代循环结束
    6. 返回最终列表并关闭功能
    7. 承诺A做出决议并将此人写入(或不写入)数据库
    8. 处理此问题的典型方法是什么?我应该在"key_entered"或{{1}}回调中运行承诺吗?另外,我如何确保我的所有承诺都已得到解决?也许我只是误解了一些关于Promises的基本知识。

0 个答案:

没有答案