Node.js异步数组迭代



我正在尝试使用 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/第一个到达/第一个阵列元素:

  • 控制台.log(供应商)
  • 控制台.log(order_item)
  • 控制台.log(分销商)

对于供应商 2/第二个阵列元件:

  • 控制台.log(供应商)
  • 控制台.log(order_item)
  • 控制台.log(分销商)

对于供应商 3/第三个阵列元件:

  • 控制台.log(供应商)
  • 控制台.log(order_item)
  • 控制台.log(分销商)

但是,它异步运行:

  • 控制台.log(供应商)
  • 控制台.log(供应商)
  • 控制台.log(供应商)

  • 控制台.log(order_item)

  • 控制台.log(order_item)
  • 控制台.log(order_item)

  • 控制台.log(分销商)

  • 控制台.log(分销商)
  • 控制台.log(分销商)

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

提前感谢!

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

最新更新