web-dev-qa-db-ja.com

Promise.resolve()。then対setImmediate対nextTick

NodeJS 0.11とio.jsおよびNode 0.12ブランチはすべてネイティブプロミスとともに出荷されます。

ネイティブプロミス には.then method これは常に将来のイベントループサイクルで実行されます。

これまでのところ、 nextTick から切り替えて以来、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のように動作しますか?

33

Promise.resolve().thenを使用しても、nextTickに勝る利点はありません。同じキューで実行されますが、優先度が少し高くなります。つまり、Promiseハンドラーは次のティックコールバックが実行されないようにすることができます。逆は不可能です。この動作は実装の詳細であり、依存すべきではありません。

Promise.resolve().thenは明らかに遅くなります(私が思うに)、捨てられる2つのプロミスを作成するためです。

ここで広範な実装情報を見つけることができます: https://github.com/joyent/node/pull/8325

最も重要な部分:Promise.resolve().thennextTickとは異なり、setImmediateとは異なります。 setImmediateの代わりに使用すると、コードの動作が大幅に変わる可能性があります。

25
vkurchatkin

技術に関する太字の部分には答えませんが、質問だけに答えます

どちらを使用すればよいですか?

非同期に実行される関数の結果の約束に興味がない限り、Promise.resolve().then()を使用する理由はないと思います。もちろん、あなたがareの場合、コールバック地獄を処理したり、setTimeoutまたはnextTickからnew Promiseを作成したりするよりもはるかに優れています。

2番目の技術的な違いもあり、タイミングよりも重要です。プロミスは例外を飲み込みます。あなたはおそらく望んでいないでしょう。したがって、@ vkurchatkinで述べたように、破棄するだけの約束を作成しないでください。遅いだけでなく、コードが読みにくくなり、アプリがエラーを起こしやすくなるからです。

8
Bergi