Node.js异步数组迭代

时间:2016-03-23 02:17:30

标签: javascript arrays node.js asynchronous

我正在尝试使用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 / first arr / first array element:

  • 的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内部步骤所需的效果吗?

提前致谢!

1 个答案:

答案 0 :(得分:3)

如果要按顺序迭代它们,则应使用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
    });
});