Я занимаюсь разработкой в 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. Это, по сути, позволяет callbacks знать, является ли это последним обратным вызовом в последовательности, и если это так, вызовите myFunc2, когда это будет сделано.
Проблемы:
- счетчик нужен для каждой такой последовательности в коде, и имеющие бессмысленные счетчики везде не является хорошей практикой.
- Если вы помните, как конфликты потоков в классической задаче синхронизации, когда все потоки все вызовы var - в одном и том же var, будут возникать нежелательные результаты. То же самое происходит в JavaScript?
Окончательный Вопрос:
Есть ли лучшее решение?
Должно ли оно происходить параллельно или один за другим? –
Если он захочет это один за другим, то он не будет использовать асинхронные задачи. – jelgh
@jelgh Не обязательно, асинхронные задачи также могут быть сериализованы. –