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

Trying to use async.forEach Serially but Fails - Node.js

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(),直到回调 returns,forEach 循环将等待。

async.forEach 的工作方式是否不同?

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

提前致谢。

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

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)
});

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

Note, that since this function applies iteratee to each item in parallel, there is no guarantee that the iteratee functions will complete in order.

您要找的是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 
});