【问题标题】:Node.js async array iterationNode.js 异步数组迭代
【发布时间】:2016-07-10 04:23:24
【问题描述】:

我正在尝试使用 async.each 同步迭代数组:

async.each(supplier_array, function(supplier) {
    console.log('looking at : ' + supplier);
    knex(host_name + '.order_item').where({
        supplier: supplier,
        order_id: order_id
    }).then(function(data) {
        console.log(data);
        knex(host_name + '.distributor').select()
        .then(function(data) {
            console.log(data);
        }).catch(function(error) {
            console.log('error: ' + error);
        });
    }).catch(function(error) {
        console.log('error: ' + error);
    });
});

我的supplier_array 有 3 个元素。所以应该发生的是应用程序应该(同步):

对于供应商 1/第一个 arr/第一个数组元素:

  • console.log(供应商)
  • console.log(order_item)
  • console.log(发行商)

对于供应商2/第二个数组元素:

  • console.log(供应商)
  • console.log(order_item)
  • console.log(发行商)

对于供应商 3/第三个数组元素:

  • console.log(供应商)
  • console.log(order_item)
  • console.log(发行商)

但是,它是异步操作的:

  • console.log(供应商)
  • console.log(供应商)
  • console.log(供应商)

  • console.log(order_item)

  • console.log(order_item)
  • console.log(order_item)

  • console.log(发行商)

  • console.log(发行商)
  • console.log(发行商)

有人可以帮我实现同步运行async里面的步骤的预期效果吗?

提前致谢!

【问题讨论】:

  • 您可能必须对每个 knex 承诺进行“退货”。这承认 async 让它知道有一个要处理的承诺。试试看,如果它是正确的答案,请告诉我。我自己遇到了这个问题。此外,您可以将第 9 行的内部“then”移出一个级别,因为您正在返回一个承诺。

标签: javascript arrays node.js asynchronous


【解决方案1】:

如果你想以串行顺序迭代它们,你应该使用async.eachSeries。试试这样的:

async.eachSeries(supplier_array, function(supplier, callback) {
    console.log('looking at : ' + supplier);
    knex(host_name + '.order_item').where({
        supplier: supplier,
        order_id: order_id
    }).then(function(data) {
        console.log(data);
        knex(host_name + '.distributor').select()
        .then(function(data) {
            console.log(data);
            callback(); // Advance to next iteration here
        }).catch(function(error) {
            console.log('error: ' + error);
            callback(error); // Also callback when error occurs
        });
    }).catch(function(error) {
        console.log('error: ' + error);
        callback(error); // Also callback when error occurs
    });
});

【讨论】:

  • 谢谢 - 确认 - callback() 会告诉它查看下一个供应商,并将所有这些流程应用于下一个供应商?
  • 它似乎是这样工作的。此外,您还应该注意 async.js 的 README 中记录的一个常见陷阱:github.com/caolan/async#synchronous-iteration-functions
猜你喜欢
  • 2013-08-04
  • 1970-01-01
  • 2014-08-28
  • 1970-01-01
  • 2014-07-04
  • 1970-01-01
  • 2018-10-09
  • 2018-03-31
  • 2014-02-04
相关资源
最近更新 更多