为什么这个示例代码使用process.nextTick?

时间:2016-02-24 07:50:11

标签: node.js express

我遇到了这个express.js路由,它是small example in its official repo的一部分,展示了如何处理错误,看看:

app.get('/next', function(req, res, next) {
  process.nextTick(function() {
    next(new Error('oh no!'));
  });
});

我对process.nextTick()的理解是,它使得一段代码异步执行。但令人困惑的部分是:默认情况下,不是Express异步中的路由处理程序吗?为什么这个代码需要在路由处理程序中使用process.nextTick(),因为默认情况下它们是异步执行的?在我上面链接的repo中查看整个代码可能会让我的问题更加清晰,不用担心,整个仓库是20行代码。

2 个答案:

答案 0 :(得分:2)

从您向我们展示的代码中,没有理由在该代码示例中使用process.nextTick()

代码可以像这样直接调用next(new Error('oh no!'))

app.get('/next', function(req, res, next) {
    next(new Error('oh no!'));
});
如果要在某些内容运行时推迟,直到事件处理程序代码的其余部分运行后立即使用

process.nextTick()。但是,在您显示的示例中,事件处理程序中没有其他代码,因此没有其他内容可以运行 - 因此在此处使用process.nextTick()几乎没有实际的理由。

我能猜到的最好的是,他们只是展示了一个代码示例,说明如果需要,可以在将来的某个时间异步调用next(),并且不必同步调用它。他们可以使用fs.readFile()setTimeout(),它们都有异步回调,然后在这些回调中调用next() - 所有这些都证明你只需要调用next()只要您的操作完成。

答案 1 :(得分:0)

您需要了解节点不是真正异步的事实。每次通过事件循环都将运行完成。当然,你安排的事情(有回调或承诺或事件),以便每次运行完成非常短,并且不会阻止任何地方,但在运行期间没有别的办法。这与真正的多进程/多任务操作系统(如linux)不同,其中线程可能随时中断。

真正的多任务处理很难,因为无论你做什么,你都可以满足事情可能随时中断的事实,因为节点可以让你更容易,因为你可以确定你当前的线程到达终点。

因此,如果你有什么想要确保以后运行,或者 - 我认为这个例子正在显示 - 你不需要它立即运行,最好放弃并让系统的其他部分有他们的发言权,然后你调用process.nextTick()。

相关问题