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
のように動作しますか?
Promise.resolve().then
を使用しても、nextTick
に勝る利点はありません。同じキューで実行されますが、優先度が少し高くなります。つまり、Promiseハンドラーは次のティックコールバックが実行されないようにすることができます。逆は不可能です。この動作は実装の詳細であり、依存すべきではありません。
Promise.resolve().then
は明らかに遅くなります(私が思うに)、捨てられる2つのプロミスを作成するためです。
ここで広範な実装情報を見つけることができます: https://github.com/joyent/node/pull/8325
最も重要な部分:Promise.resolve().then
はnextTick
とは異なり、setImmediate
とは異なります。 setImmediate
の代わりに使用すると、コードの動作が大幅に変わる可能性があります。
技術に関する太字の部分には答えませんが、質問だけに答えます
どちらを使用すればよいですか?
非同期に実行される関数の結果の約束に興味がない限り、Promise.resolve().then()
を使用する理由はないと思います。もちろん、あなたがareの場合、コールバック地獄を処理したり、setTimeout
またはnextTick
からnew Promise
を作成したりするよりもはるかに優れています。
2番目の技術的な違いもあり、タイミングよりも重要です。プロミスは例外を飲み込みます。あなたはおそらく望んでいないでしょう。したがって、@ vkurchatkinで述べたように、破棄するだけの約束を作成しないでください。遅いだけでなく、コードが読みにくくなり、アプリがエラーを起こしやすくなるからです。