36

NodeJS 0.11 と io.js および Node 0.12 ブランチはすべて、ネイティブの promise と共に出荷されます。

ネイティブの promise には、将来のイベント ループ サイクルで常に実行されるメソッド.thenがあります。

これまでのところ、 nextTick から切り替えてsetImmediate以来、イベント ループの次の繰り返しにキューイングするために使用してきました。

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

これを行うための新しい方法ができたので:

Promise.resolve().then(deferThisToNextTick); 

どちらを使用する必要がありますか? また、イベント ループの前または後に実行されるコードに関して、同様Promise.resolve.then動作しますか?setImmediatenextTick

4

3 に答える 3

31

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

Promise.resolve().then破棄される2つの約束を作成するため、明らかに遅いです(かなりだと思います)。

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

最も重要な部分:Promise.resolve().thenは似nextTickていて、似ていませんsetImmediate。それを代わりに使用するとsetImmediate、コードの動作が大幅に変わる可能性があります。

于 2014-12-25T15:11:15.923 に答える
9

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

どちらを使用する必要がありますか?

Promise.resolve().then()非同期で実行された関数の結果に対する約束に興味がない限り、使用する理由はないと思います。もちろん、あなた. _new PromisesetTimeoutnextTick

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

于 2014-12-25T17:02:33.533 に答える