等待嵌套循环在nodejs中完成

时间:2017-08-04 19:44:43

标签: node.js

我对node.js很新,这是我的问题

我在这里有一组嵌套的地图(我也尝试过使用for-each)。 所有"得到......"嵌套的方法返回由我定义的promise。我必须循环遍历方法返回的数据并用它来调用下一个" get .."方法(存在依赖性)。完成整个嵌套循环后," allobj"数组应该有我的最终结果,并且我试图在完成所有循环后返回它。到目前为止,我还没有运气,因为返回一个空数组。

var allobj = new Array(); 
var catcount = 0; 

//categories.forEach(function(category){    
var p = categories.map(function(category,index,array){          
catcount++;

return gettests(runid,category).then(function(tests){
//console.log(tests.sort().reverse());     //this is sync   

    //tests.forEach(function(test){
    var t = tests.map(function(test,index,array){  

        return getmetriccategories(runid,category,test).then(function(data){
       //console.log(data);

        //data.forEach(function(mc){
        var d = data.map(function(mc,index,array){  

            return getmetrics(runid,category,test,mc).then(function(data1){

                var x = data1.map(function(metric,index,array){
                            allobj.push(metric);
                            return metric;
                        });
                    });   
                });
            })
        })
    })
}) 

//return when all nested loops are done       
res.send(allobj);      

1 个答案:

答案 0 :(得分:0)

您的函数getmetriccategoriesgetmetrics返回Promises,至少它们的返回值似乎有一个then方法,这是一个指标。这意味着,它们异步工作。因此,map调用不直接返回结果,而是返回Promises数组。要等待所有这些Promise得到满足(这意味着异步函数已完成),您可以使用Promise.all函数:

Promise.all(data.map(...))
    .then(function (result) {
        res.send(result)
    })

如您所见,Promise.all会返回新的承诺,因此您可以使用then来接收结果并使用res.send发送。