Node.js:如何防止两个回调同时运行?

时间:2016-01-18 18:25:09

标签: javascript node.js asynchronous

我对Node.js有点新鲜。我遇到了一个问题,我想阻止回调在它已被执行时运行。例如:

items.forEach(function(item) {
    doLongTask(item, function handler(result) {
        // If items.length > 1, this will get executed multiple times.
    });
});

如何让handler的其他调用等待第一个调用才能完成?我正在思考一些排队的事情,但我是Node.js的新手,所以我不确定该怎么做。想法?

2 个答案:

答案 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代码并行执行。所以,如果你所做的只是一些计算,你根本不需要担心这一点。