Я уже довольно давно занимаюсь разработкой на 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
Предлагаемое решение:
Initiate a counter at the beginning of the loop holding the length of the loop, и each callback decrements that counter. When the counter hits 0, execute myFunc2. This is essentially to let the callbacks know if it the last callback in sequence и if it is, call myFunc2 when it done.
Инициируйте счетчик в начале цикла, содержащий длину цикла, и каждый обратный вызов уменьшает этот счетчик. Когда счетчик достигнет 0, выполните myFunc2. По сути, это должно дать возможность обратным вызовам знать, является ли это последним обратным вызовом в последовательности, и если это так, вызовите myFunc2, когда это будет сделано. Проблемы:
- Счетчик необходим для каждой такой последовательности в вашем коде, и использование бессмысленных счетчиков везде не является хорошей практикой.
- Если вы помните, как поток конфликтует в классической проблеме синхронизации, когда все потоки все вызывают var-- для одного и того же var, могут произойти нежелательные результаты. Происходит ли то же самое в JavaScript?
Окончательный вопрос:
Есть ли лучшее решение?