Как решить JQuery-загадку $.each, ajax, acync: false?

Столкнулся с загадкой.

Цикл перебирает асоц. массив, отправляя данные ajax-ом. Перед циклом вызывается функция html() которая меняет контент DOM. Тоже самое делается в самом цикле, дабы виден был результат. И в конце обработки цикла снова вызывается html() дабы огласить конец обработки.

Загадка в том, почему дом не отображает новый контент, хотя консоль говорит об обратном. То есть не видно счетчика. Хотя если расставить alert и смотреть пошагово, все работает нормально.
  • Вопрос задан
  • 3417 просмотров
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Дело в том что отрисовка, выполнение js, пересчет стилей - все выполняется в одном потоке. Вы поменяли что-то в dom, это дело добавилось в очередь, а потом вы заблокировали поток синхронными вызовами ajax. Это поведение разнится от браузера к браузеру и от версии оной. Скажем в последних хромах можно включить эксперементальную фичу, которая выполняет перерисовку страницы в отдельном потоке.

Именно по этому работа с сетью и т.д. должна быть асинхронной. То есть если вам нужно что-то сделать, то обходя циклом ваш массив данными, вы отправляете запрос (асинхронно) и сохраняете в массив promise, который возвращает функция .ajax(). Если вам нужно что-то сделать когда все запросы завершатся - просто ставите jQuery.when где нужно и если все прошло удачно отрабатываете.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы