尝试使用async.forEach Serially但失败 - Node.js

时间:2016-02-17 11:18:55

标签: javascript node.js asynchronous foreach node-async

forEach,我正在使用async库。在foreach循环中,我将调用不同的服务并获取数据。这些数据应该是为了在我看来处理它,因为这些是一些着装细节,需要整理好。所以我试图通过在外部服务回调中添加done()来使foreach循环同步。

var address_deails = [];
var x = 0;

async.forEach(lat_long, function (item, done) {
    external_servie(item,config,function (err, data) {
        if (err) {
            callback(err, null);
        } else {
            //code here .......
            address_deails[x]  = //some_data;
        }
        x++;
        done();  <------------- Here 
    });
}, function(err) {
    if(err) {
        callback(err,null)
    } else {
        callback(err,address_deails)
    }
});

但我每次都会以不同的顺序获得价值。

我想按顺序获取数组键0,1,2

据我所知,我认为如果在回调中使用done(),则在回调返回之前,forEach循环将等待。

async.forEach的工作方式不同吗?

你能给我任何建议,以便我可以解决我的问题,可以使用其他库而不是异步。

提前致谢。

2 个答案:

答案 0 :(得分:3)

async.forEach()async.each的别名,文档说:

  

注意,由于此函数并行地将iteratee应用于每个项目,因此无法保证iteratee函数将按顺序完成。

您要找的是async.eachSeries() / async.forEachSeries()

async.eachSeries(lat_long, function (item, done) {
    external_servie(item,config,function (err, data) {
        if (err) {
            callback(err, null);
        } else {
            //code here .......
            address_deails[x]  = //some_data;
        }
        x++;
        done();  <------------- Here 
    });
}, function(err) {
    if(err) {
        callback(err,null)
    } else {
        callback(err,address_deails)
    }
});

现在您可以进入address_deails而不是维护索引:address_deails.push(/* some data */);

您的external_service的错误管理也存在问题:

external_servie(item,config,function (err, data) {
    if (err) {
        done(err); // <<< call done with the error to stop the loop or it will continue
    } else {
        //code here .......
        address_deails.push(/* some data */);        
    }
    done();  <------------- Here 
});

答案 1 :(得分:0)

您可以使用匿名函数来更正索引:

async.forEach(lat_long, function (item, done) {
  (function(index) {
    external_servie(item,config,function (err, data) {
        if (err) {
            callback(err, null);
        } else {
            //code here .......
            address_deails[index]  = //some_data;
        }
        done();  <------------- Here 
    });
  })(x);
  x++
}, function(err) {
        console.log(err,address_deails)
});