Promise.resolve()。然后vs setImmediate vs nextTick

时间:2014-12-25 13:44:22

标签: javascript node.js promise es6-promise

NodeJS 0.11以及io.js和Node 0.12分支都附带本机承诺。

本机承诺have a .then method,它总是在未来的事件循环周期中执行。

到目前为止,我一直在使用setImmediate将事情排队到事件循环的下一次迭代,因为我switched from nextTick

setImmediate(deferThisToNextTick); // My NodeJS 0.10 code
process.nextTick(deferThisToNextTick); // My NodeJS 0.8 code

因为我们现在有了一种新方法:

Promise.resolve().then(deferThisToNextTick); 

我应该使用哪个?另外 - 对于在事件循环之前或之后运行的代码,Promise.resolve.thensetImmediate还是nextTick

3 个答案:

答案 0 :(得分:25)

使用Promise.resolve().then优于nextTick。它运行在同一个队列中,但具有稍高的优先级,也就是说,promise处理程序可以阻止下一个tick回调运行,相反是不可能的。此行为是一个实现细节,不应该依赖它。

Promise.resolve().then显然较慢(我认为很多),因为它创造了两个将被丢弃的承诺。

您可以在此处找到详细的实施信息:https://github.com/joyent/node/pull/8325

最重要的部分:Promise.resolve().thennextTick类似,而不像setImmediate。在setImmediate的位置使用它可以彻底改变您的代码行为。

答案 1 :(得分:8)

我不打算回答关于技术性问题的粗体部分,而只回答问题

  

我应该使用哪个?

我认为没有任何理由使用Promise.resolve().then(),除非您对异步执行函数的结果的承诺感兴趣。当然,如果 ,那么这比处理回调地狱或从new PromisesetTimeout制作nextTick要好得多。

还有第二个技术差异,比时间更重要:承诺会吞下例外。你可能不想要的。因此,就像@vkurchatkin所提到的那样,不要创造承诺只是为了抛弃它们。不仅因为它速度较慢,而且因为它使您的代码可读性降低,而且您的应用程序更容易出错。

答案 2 :(得分:-3)

Promise.resolve将立即(同步)解决,而setImmediate在执行当前事件后显式直接解决。