【问题标题】:Trying to use async.forEach Serially but Fails - Node.js尝试连续使用 async.forEach 但失败 - Node.js
【发布时间】:2016-05-29 01:38:53
【问题描述】:

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 的工作方式有什么不同吗?

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

提前致谢。

【问题讨论】:

  • asyncforEach 吗?
  • 你使用的是什么版本的异步?我认为当前没有forEach? async.each 不保证系列会按顺序运行。
  • @Seonixx 我的版本是 1.4.2
  • @Jai 是的,我使用的是 1.4.2。我可以使用其他库来实现这一点吗?
  • @KanishkaPanamaldeniya github.com/caolan/async#collections 我对此表示怀疑。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-08
      • 2019-01-29
      • 1970-01-01
      相关资源
      最近更新 更多