我遇到了这个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行代码。
答案 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()。