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

我遇到了这个express.js路由,它是官方回购的一个小例子的一部分,展示了如何处理错误,看看:

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

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

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

代码可以直接调用next(new Error('oh no!'))如下所示:

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

process.nextTick()用于在事件处理程序代码运行之后立即运行时才推迟。 但是,在你显示的例子中,事件处理程序中没有其他代码,所以没有别的东西可以运行 – 因此在这里使用process.nextTick()没有实际的理由。

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

您需要让您了解节点并非真正asynchronous的事实。 每一次通过事件循环都会运行完成。 当然,你安排的事情(callback或承诺或事件),使每个运行完成非常短,并没有阻止任何地方,但在运行过程中没有别的。 这不像一个真正的多进程/多任务操作系统,如linux,其中一个线程可能随时被打断。

真正的多任务处理是很难的,因为无论你做什么,你都可以随时随地处理事件,因为节点使得它更容易,因为你可以确定当前的线程结束了。

所以如果你想确保稍后运行,或者正如我认为这个例子所显示的那样 – 你不需要马上运行,而是让系统的其他部分变得更好,有发言权,那么你可以调用process.nextTick()。