2016-11-19 6 views
0

奇妙な質問の種類は、10のSYNCRONOUS関数を実行する必要がある状況を想像してください。完了するときは関係ありません。あなたはそのような約束を使用する場合は非同期コードをNode.jsのスレッドとして扱いますか?

f1() 
f2() 
f3() 
... 
f10() 
doStuffWithResult(); 

は今、あなたはpromoisesとして、それぞれを書き直していると仮定:

Promise.All([f1,f2,f3,f4,f5,f6,f7,f8,f9,f10]) 
.then(() => { 
    doStuffWithResult(); 
}) 

あなたはパフォーマンスの向上を参照してくださいか?理論的には、これらの関数がまだ同期しており、すべてがまだ1つのスレッドで実行されているため、いいえと言いたい。

ありがとうございます!

+1

いいえ、約束はスレッドではなく、コードを並行して実行させません。 – Bergi

答えて

3

パフォーマンスが向上しますか?

いいえ、あなたが提案しているものは速くないでしょう。

約束はスレッドを作成しません。彼らが行うことは、非同期操作がいつ完了したのかを追跡し、利害関係者に成功または失敗を通知するための協調システムを提供することだけです。また、非同期操作がネストされたときにエラーを伝播するためのサービスも提供します。

あなたの提案したPromise.all()コードは機能しません。関数の配列の配列ではなく、Promise.all()に一連の約束を渡す必要があります。あなたの例では、あなたの関数は呼び出されません。

コードを実際に実行するものに変更した場合、約束コードを実行し、すべての.then()ハンドラが将来のティックで実行されるため、同期関数を直接呼び出すよりも時間がかかる可能性があります。同期的に)。

node.jsでは、同期したものを並行して実行する唯一の方法は、(並列に実行できる)子プロセスを起動するか、実際のOSスレッドを使用できるネイティブコードに操作を渡すことです。

+0

@SammyRoberts - これはあなたの質問に答えましたか?その場合は、回答の左側にある緑色のチェックマークをクリックして、コミュニティにその旨を示すことができます。そうでない場合は、あなたの質問のどの部分がまだ答えられていないかを示すコメントを残してください。 – jfriend00

関連する問題