私はかなり長い間 JavaScript で開発を行ってきましたが、常に頭を悩ます多くのことの 1 つは 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でも同じことが起こりますか?
究極の質問:
より良い解決策はありますか?