async:false
устарело по уважительной причине: оно блокирует пользовательский интерфейс до завершения запроса, что не совсем идеально с точки зрения удобства использования. Никогда не используйте async:false
.
По умолчанию async:true
(или просто полное пропускание строки async
) - это то, что вам нужно. «Проблема» с асинхронным кодом, на которую, я подозреваю, вы ссылаетесь, заключается в том, что вы просто должны помнить, что код асинхронный! Многие разработчики, плохо знакомые с асинхронностью, пытаются трактовать свой асинхронный код как синхронный и заканчивают тем, что пытаются манипулировать результатами вызовов XHR до того, как они вернутся.
В качестве одного из примеров такого рода вещей, которые могут сбить людей с толку, см. console.log(counter)
ниже: он всегда показывает «6» вместо того, чтобы считать от 0 до 5, как и следовало ожидать, если код был синхронным. Причина этого заключается в том, что все итерации цикла while
выполняются до первого асинхронного ответа, поэтому к моменту запуска первой функции success
счетчик уже достиг своего максимального значения.
Другие потенциальные опасности могут включать в себя вызовы ajax, возвращающиеся в «неправильном» порядке (нет гарантии, что каждый запрос будет занимать одинаковое количество времени), или (как в вопросе, с которым вы связаны) ошибки сервера или плохие условия в сети, вызывающие некоторые из просьб никогда не возвращаться вообще.
Методы для решения всех этих проблем, конечно, существуют, но самый важный из них - просто осознавать, что это, во-первых, возможности, поэтому вы не заглядываете в угол.
Код в вашем вопросе не демонстрирует проблему, показанную в моем примере здесь, потому что вы (правильно) только пытаетесь изменить свои переменные в функциях success
, и (потому что вы просто делаете сложение) это не Неважно, в каком порядке звонки возвращаются.
Вы могли бы добиться небольшого прироста производительности, пакетируя вызовы XHR вместе и вставляя результаты в DOM только после того, как все они завершены; но только для шести итераций это может не стоить хлопот.
TL; DR: ваш код в порядке, как есть (при условии, что вы исправите синтаксические ошибки и используете реальный URL JSON, как отмечено в комментариях выше).