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

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

Native承诺有一个.then方法 ,总是在将来的事件循环中执行。

到目前为止,自从我从nextTick切换到现在,我一直使用setImmediate将事物setImmediate到事件循环的下一个迭代中:

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

由于我们现在有一个新的方法来做到这一点:

 Promise.resolve().then(deferThisToNextTick); 

我应该用哪个? 另外 – Promise.resolve.then行为像setImmediate或像nextTick关于事件循环之前或之后运行的代码?

使用Promise.resolve().thennextTick没有任何优势。 它运行在相同的队列上,但具有稍高的优先级,也就是说,promise处理程序可以阻止下一个tick的callback,相反是不可能的。 这种行为是一个实现细节,不应该依赖。

Promise.resolve().then显然比较慢(我认为很多),因为它创build了两个将被抛弃的promise。

你可以在这里find大量的实现信息: https : //github.com/joyent/node/pull/8325

最重要的部分: Promise.resolve().then是像nextTick而不是像setImmediate 。 在setImmediate使用它可以大大改变你的代码行为。

我不会回答关于技术问题的粗体部分,而只是回答问题

我应该用哪个?

我不认为有任何理由使用Promise.resolve().then()除非您对asynchronous执行的函数的结果的承诺感兴趣。 当然,如果你这样的话,那么这将比处理callback地狱或者从setTimeoutnextTick做出new Promise nextTick

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

Promise.resolve将立即解决(syncroniously),而setImmediate直接执行当前事件后。