【问题标题】:Nodejs async.each wait for first loopNodejs async.each 等待第一个循环
【发布时间】:2016-04-27 21:00:44
【问题描述】:

我正在尝试异步处理 rowsArr(比如说 100 条记录),但我只想从数据库加载国家/地区列表一次以避免数据库连接。我正在尝试下面的示例代码,但它打开数据库连接 100 次。

var countryList = null;

async.each(rowsArr, function(row, callback) {


    if( countryList == null )
    {
        console.log("open database here to get country list and then assign to below variable");

        countryList = countriesFromDatabase;

        callback( countryList );
    }
    else
    {
        callback( countryList );
    }


}, function(err){

      console.log("all rows are processed");

});

async.eachSeries 可以正常工作,但我希望它采用异步方式。有什么建议吗?

【问题讨论】:

    标签: javascript node.js asynchronous


    【解决方案1】:
    1. 从数据库中获取国家
    2. 处理所有行

    所以下面会起作用

    function getCountries(callback) {
      console.log("open database here to get country list and then assign to below variable");
      callback(null,countriesFromDatabase);
    }
    getCountries(function(err, countriesFromDatabase) {
     // use countries in following async loop
      async.each(rowsArr, function(row, callback) {
        callback(null, row); //process row here
      }, function(err) {
        console.log("all rows are processed");
      });
    });
    

    【讨论】:

    • 这种方法很好,但我上面的函数已经在另一个循环中了。所以100条记录要在一个循环中处理,有数百万条记录。
    • 我假设在你得到countriesFromDatabase之前你不能处理row,所以如果我在第一次迭代中得到countriesFromDatabase,其他行不会有countriesFromDatabase(异步)所以我猜你需要改变一下功能
    • 这几乎可以肯定是发布的问题的正确答案。我要么编辑问题以反映为什么这个答案不起作用,要么接受它。
    • 我会根据给出的建议改变我的代码逻辑。谢谢。
    【解决方案2】:

    它实际上做了它应该做的事情,所有一百行处理同时开始,并且它们正在传递 if 块。

    您可能想要使用锁。 https://github.com/BorisKozo/node-async-locks

    这样你可以锁定你的 countryList 检查过程以避免多个数据库连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-19
      • 1970-01-01
      • 2020-04-20
      • 2020-04-17
      • 2020-10-31
      • 2023-01-20
      相关资源
      最近更新 更多