私はずっとJavaScriptで開発してきましたが、ネットではまだカウボーイの開発者です。いつも私を悩ませている多くの事の一つは、JavaScriptのコールバックを同期させることです。JavaScriptコールバックの同期方法
この問題が発生する一般的なシナリオについて説明します。forループで複数回実行する操作があり、各操作にコールバックがあります。 forループの後で、別の操作を実行する必要がありますが、この操作はforループからのすべてのコールバックが完了した場合にのみ正常に実行できます。
コード例:
for ... in ... { myFunc1(callback); // callbacks are executed asynchly } myFunc2(); // can only execute properly if all the myFunc1 callbacks are done
推奨解決策:
は、ループの長さを保持しているループの開始時にカウンタを開始し、そして各コールバックはそれをデクリメントカウンタ。カウンタが0に達すると、myFunc2を実行します。これは本質的に、コールバックが最後のコールバックであるかどうかを順番に知らせ、そうであれば、完了したらmyFunc2を呼び出します。
問題:
- カウンタは、あなたのコード内のすべてのそのような配列のために必要な、そしてどこでも無意味なカウンターを持つことは良い習慣ではありません。
- あなたは、古典的な同期の問題でどのようにスレッドの競合をリコールした場合、複数のスレッドがすべて同じVARにvar--呼びかけているとき、望ましくない結果が発生します。 JavaScriptでも同じことが起こりますか?
究極の質問:
は、よりよい解決策はありますか?それらの一つ一つが、別の関数であり、変数は(var
で)正しく宣言されているよう
パラレルにまたは次々に起こるはずですか? –
彼はそれを次々と望むなら、彼は非同期タスクを使用しないでしょう。 – jelgh
@jelgh非同期タスクをシリアライズする必要があるとは限りません。 –