2016-04-20 16 views
1

私は、コールバック関数を使用するのではなく、非同期コードを扱うのがより簡単になると理解していますが、純粋な同期コードに使用する利点についてはあまり明確ではありません。Javascriptの約束で同期コードを折り返すことに利点はありますか?

私は、(非同期ではなく純粋な計算)5秒かかる高価な計算を実行する関数を持っているとしましょう。約束は、単一のJSのスレッドと同じスレッドで実行されますので、任意の利点は、これを行うにはあります。

expensiveFunction() { 
    // expensive function that takes 5 seconds to complete 
} 

expensiveFunction(); 
doSomethingAfterwards(); 

の代わりに、この:

expensiveFunctionPromise() { 
    return new Promise(function(resolve) { 
    // expensive function that takes 5 seconds to complete 
    resolve(); 
    } 
} 

expensiveFunction().then(doSomethingAfterwards); 

編集:私はそのjsfiddleを一緒に入れ両者の間に有意差を示さないように思われる:

https://jsfiddle.net/nu1wj681/

同期バージョンが周りに取りますループごとに3秒、合計6秒ですが、promise/asyncバージョンはループごとに6秒かかりますが、合計時間はまだ6秒です。これは両方が並行して実行されていることを示していますが、糸。

+2

いいえ、コードが複雑になります。これを行う唯一の理由は、関数_might_がある時点で非同期になる場合です。 –

+0

同期コードが高価な場合は、[Webワーカー](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers)を調べる必要があります。 Webワーカーを管理することは、約束を使用する正当な理由になる可能性があります。 – JLRishe

答えて

0

プロキシは、非同期コードの管理に役立つように設計されているため、少なくとも私が知っている限り、同期処理に使用すると利点はありません。また、約束自体は非同期ではないため、約束内の同期コードは引き続き実行されます。

プロミスオブジェクトが延期と非同期の計算に使用されています。このような状況において も、「ドキュメント」の最初の文を見てみましょう。 Promiseはまだ完了していない操作を表しますが、今後は が必要です。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

同期コードだけで、将来的に完了しません。

"高価な関数"を非同期で実行し、メインスレッドで実行しない場合は、 "Webワーカー"を見てみるとよいでしょう。ウェブワーカーとの約束を使用することは素晴らしいことです。

関連する問題