36

NodeJS 0.11 以及 io.js 和 Node 0.12 分支都带有原生承诺。

原生 Promise有一个.then方法,它总是在未来的事件循环周期中执行。

到目前为止setImmediate,自从我从 nextTick 切换以来,我一直在使用将事情排队到事件循环的下一次迭代:

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

因为我们现在有了一种新的方法来做到这一点:

Promise.resolve().then(deferThisToNextTick); 

我应该使用哪个?另外 -在事件循环之前或之后运行的代码是否Promise.resolve.then表现得像setImmediate或像nextTick

4

3 回答 3

31

使用Promise.resolve().then没有任何优势nextTick。它在同一个队列上运行,但优先级略高,也就是说,promise handler 可以阻止 next tick 回调永远运行,相反是不可能的。此行为是一个实现细节,不应依赖。

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

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

最重要的部分:Promise.resolve().then喜欢nextTick和不喜欢setImmediate。使用它setImmediate可以极大地改变你的代码行为。

于 2014-12-25T15:11:15.923 回答
9

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

我应该使用哪个?

我认为没有任何理由使用Promise.resolve().then(),除非您对异步执行函数结果的承诺感兴趣。当然,如果你,那么这将远远优于处理回调地狱或制作new Promisefrom setTimeoutor nextTick

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

于 2014-12-25T17:02:33.533 回答
-4

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

于 2017-07-03T04:03:54.540 回答