最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

如何等待在节点和firebase中完成的承诺

IT培训 admin 6浏览 0评论

如何等待在节点和firebase中完成的承诺

我一直试图解决这个问题很长一段时间,但无法让它工作。

g_globalList.once("value").then(function(tickList){
    var multiPaths = [];    
    tickList.forEach(function(ticker){
        ticker.val().forEach(function(path){
            multiPaths.push(path);
        });
    });
    return multiPaths;        
}).then(function(multiPaths){
    var myObj = {};
    multiPaths.forEach(function(path){
        var ticker = path.substr(path.lastIndexOf("/")+1, 40);
        console.log("adding " + ticker);

        ****this is another promise and make my "myObj" to print blank****

        db.child("symbols/NSE/" +ticker).once('value').then(function(data){
            if(data.exists()){
                myObj[path] = data.val();
            }       
        });
    });
    return myObj;
}).then(function(myObj){
    console.log(myObj);
});

无论如何,我可以在所有承诺完成后最后一次调用“console.log(myObj)”吗?

回答如下:

您可以使用Promise#all等待所有Promises解析,请查看下面的示例(我没有测试但可能会给您一个解决问题的想法):

var allPaths = [];

g_globalList.once("value").then(function(tickList){  
    return Promise.all(
   //map will create a array of the returned values (Promises in this case)
        tickList.map(function(ticker){
            return ticker.val();
        })
    );
}).then(function(values){//values represents all then results
    allPaths = values; //store for later all paths
    return Promise.all(
        //map will create a array of returned values (Promises in this case)
        values.map(function(path){

            var ticker = path.substr(path.lastIndexOf("/")+1, 40);
            return db.child("symbols/NSE/" +ticker).once('value');
        })
    );
}).then(function(values){//values represents all then results
    var myObj = {}; //now lets create a obj

    for(var i = 0; i < allPaths.length; i++){ //foreach path
        var path = allPaths[i];
        //get the ticker name again
        var ticker = path.substr(path.lastIndexOf("/")+1, 40);

        //check your data
        var data = values[i];
        if(data.exists()){
            //add to the obj
            myObj[path] = data.val();
        }      
    }
    //return the obj
    return myObj;
})
.then(function(myObj){
    //i hope its here now
    console.log(myObj);
});

如何等待在节点和firebase中完成的承诺

我一直试图解决这个问题很长一段时间,但无法让它工作。

g_globalList.once("value").then(function(tickList){
    var multiPaths = [];    
    tickList.forEach(function(ticker){
        ticker.val().forEach(function(path){
            multiPaths.push(path);
        });
    });
    return multiPaths;        
}).then(function(multiPaths){
    var myObj = {};
    multiPaths.forEach(function(path){
        var ticker = path.substr(path.lastIndexOf("/")+1, 40);
        console.log("adding " + ticker);

        ****this is another promise and make my "myObj" to print blank****

        db.child("symbols/NSE/" +ticker).once('value').then(function(data){
            if(data.exists()){
                myObj[path] = data.val();
            }       
        });
    });
    return myObj;
}).then(function(myObj){
    console.log(myObj);
});

无论如何,我可以在所有承诺完成后最后一次调用“console.log(myObj)”吗?

回答如下:

您可以使用Promise#all等待所有Promises解析,请查看下面的示例(我没有测试但可能会给您一个解决问题的想法):

var allPaths = [];

g_globalList.once("value").then(function(tickList){  
    return Promise.all(
   //map will create a array of the returned values (Promises in this case)
        tickList.map(function(ticker){
            return ticker.val();
        })
    );
}).then(function(values){//values represents all then results
    allPaths = values; //store for later all paths
    return Promise.all(
        //map will create a array of returned values (Promises in this case)
        values.map(function(path){

            var ticker = path.substr(path.lastIndexOf("/")+1, 40);
            return db.child("symbols/NSE/" +ticker).once('value');
        })
    );
}).then(function(values){//values represents all then results
    var myObj = {}; //now lets create a obj

    for(var i = 0; i < allPaths.length; i++){ //foreach path
        var path = allPaths[i];
        //get the ticker name again
        var ticker = path.substr(path.lastIndexOf("/")+1, 40);

        //check your data
        var data = values[i];
        if(data.exists()){
            //add to the obj
            myObj[path] = data.val();
        }      
    }
    //return the obj
    return myObj;
})
.then(function(myObj){
    //i hope its here now
    console.log(myObj);
});
发布评论

评论列表 (0)

  1. 暂无评论