我对Node.js有点新鲜。我遇到了一个问题,我想阻止回调在它已被执行时运行。例如:
items.forEach(function(item) {
doLongTask(item, function handler(result) {
// If items.length > 1, this will get executed multiple times.
});
});
如何让handler
的其他调用等待第一个调用才能完成?我正在思考一些排队的事情,但我是Node.js的新手,所以我不确定该怎么做。想法?
答案 0 :(得分:2)
如何防止两个回调同时运行?
除非它们是异步的,否则它们不会同时运行 ,因为Node在单个线程上运行JavaScript。异步操作可以重叠,但JavaScript线程一次只能做一件事。
所以推测doLongTask
是异步的。您不能将forEach
用于您想要做的事情,但它仍然不难:您只需跟踪列表中的位置,然后等待下一个处理直到上一个完成:
var n = 0;
processItem();
function processItem() {
if (n < items.length) {
doLongTask(items[n], function handler(result) {
++n;
processItem();
});
}
}
答案 1 :(得分:2)
已有图书馆负责处理,最常用的是async。
您将对async.eachSeries()
功能感兴趣。
至于一个实际的例子......
const async = require('async')
async.eachSeries(
items,
(item, next) => {
// Do stuff with item, and when you are done, call next
// ...
next()
},
err => {
// either there was an error in one of the handlers and
// execution was stopped, or all items have been processed
}
)
至于库如何做到这一点,你最好看一下源代码。
应该注意的是,如果您的项目处理程序执行异步操作(例如与文件系统或Internet等接口),这只会有意义。在Node.js中不存在会导致一段JS代码的操作与同一进程中的另一个JS代码并行执行。所以,如果你所做的只是一些计算,你根本不需要担心这一点。