Node.js 异步数组迭代
Posted
技术标签:
【中文标题】Node.js 异步数组迭代【英文标题】:Node.js async array iteration 【发布时间】: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”移出一个级别,因为您正在返回一个承诺。 【参考方案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以上是关于Node.js 异步数组迭代的主要内容,如果未能解决你的问题,请参考以下文章