Node.js Api在异步循环中调用

Kun*_*nle 5 javascript foreach asynchronous callback node.js

我很难进行多次api调用并将返回的结果放在正确的位置.这就是我想要实现的:两个循环,嵌套.外部循环遍历复杂的json对象,并将一些对象的值放在数组调用框中.内部循环调用api并将返回的结果放在名为bag的数组中.所以我的盒子和包里装满了数据.当循环和api调用都结束时,我希望能够访问盒子和包中的数据并使用它进行操作.我只是不确定在执行的同一点上访问两个数组的最佳方法.这是我到目前为止所拥有的,但当然包和盒子都是空的,因为它们在所有循环和api调用结束之前被调用.

var data = {}//a json object with data;
var bag = [];
var box = [];

async.forEach(data.item, function(item, callback){

    async.forEach(item.name, function(name, callback){

        callApi(item.name, function(obj){

           bag.push(obj);
        });

        callback();

    }

   box.push(item);
   callback();

});


function callApi(name, callback){

    asyncApiCall(url+name, function(err, result){

        callback(result);       
    });

}

//when all loops and api requests are done
//do stuff with contents of box and bag here;
console.log(bag, box);
Run Code Online (Sandbox Code Playgroud)

Ais*_*war 5

您可以使用计数器来确保所有异步调用均已返回,然后调用回调。一个例子:

function performAsyncOperation(data, onCompletion) {
    var bag = [];
    var box = [];
    var count  = 0;

    async.forEach(data.item, function(item, callback){
        async.forEach(item.name, function(name, callback){
            count += 1;
            callApi(item.name, function(obj){
               bag.push(obj);
               count -= 1;
               if (count == 0) {
                   onCompletion(null, { bag:bag, box:box });
               }
            });
            callback();
        }
       box.push(item);
       callback();
    });
}
Run Code Online (Sandbox Code Playgroud)

countonCompletion是上面的重要部分。