2017-01-10 8 views
1

ECMAScriptでは、私は基本的には.cancel()機能を持つPromiseであるCancelablePromise(https://github.com/alkemics/CancelablePromise)を使用しています。 .cancel()が呼び出されるたびに、.then()および.catch()に提供されるコールバックは実行されません。私はキャンセル約束を待っていたらどうなるのだろうかawaitが返されない場合はどうなりますか?

CancelablePromise promise = new CancelablePromise((resolve, reject) => resolve(1)); 
const promise2 = promise.then(x => x + 1); 
promise.cancel(); 
console.log(await promise2); 

予想ように、このコードは動作しますが、何もコンソールに出力されません。しかし、GCで収集できない、または完全に安全で有効なぶら下がりスレッド/参照が作成されるのではないかと思います。

+0

私は、GCが「取消し可能な約束」を「知っていない」ので、GCが「収集」できないと考えていると思います。申し訳ありませんが、おそらくすべてのjavascriptエンジンの内部知識この質問でつまずく可能性があり、決定的な答えを得ることができます:p –

+0

も参照してください。http://stackoverflow.com/q/34289551/1048572 – Bergi

+0

そのライブラリは使用しないでください。それは恐ろしく実装されています。 – Bergi

答えて

3

awaitは、約束の上に文法的な砂糖です。これは、ES6のp.then()ステートメントに類似しています。 ES6では、約束が解決されない場合、.then()ハンドラ内のコードは決して実行されません。 awaitの場合、インタプリタは次のコードブロックを自動的に作成された.then()ハンドラの中に置きます。内部的にも、同じように動作します。

実行中の余分なスレッドはありません。 awaitはスレッドを使用しません。なぜ約束が決して解決されないのかによって、約束は内部ではおそらく未来のある時点で解決できる潜在的なコードによって参照されている可能性があるため、決してGCされません。

これは災害ではありませんが、おそらく良い設計ではありません。約束が決して解決できない状況がある場合は、少なくともタイムアウトを使用して約束を明確にするか、基本的な操作を取り消す方法を見つけるべきです。実際の操作の具体的な詳細がなければ、より具体的な推奨事項を提供することはできません。

関連する問題