jessepinkman010101
@jessepinkman010101
Варю синий код

Async: false; — плохая практика?

Привет!
Возникла необходимость в синхронных ajax-запросах.
Добавив эту опцию все начинает работать как нужно, но вот мысли, что это плохая практика и тому подобное не даёт мне покоя. Конкретного примера нет, будет сложно весь код в рамках этого сайта расписать, но вот, что могу сказать: SPA приложение, mutation observer ловит изменения, делает проверку и заполняет массив потоми делает запрос. Но тут почему то ajax не ждёт пока заполнится массив и сразу выполняет запрос.

Существуют ли случаи, когда оправдано использование синхронных запросов, как в моем случае, или же это означает, что логика хромает и лучше всего все переписать, что бы в синхронности не было надобности ?
  • Вопрос задан
  • 185 просмотров
Решения вопроса 2
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
В браузере в одном потоке выполняется и Ваш JS и интерфейс пользователя и много чего еще. И если Вы заблокируете этот поток длинными вычислениями или еще чем-то, то все это встанет. Для пользователя вкладка зависнет. Не будут работать ни ссылки, ни кнопки, даже закрыть ее привычными способами будет проблематично.
Синхронный запрос блокирует поток на время всей отправки запроса и получения ответа, притом именно так, поочереди, ибо враз тут опять не выйдет. Добавьте сюда еще то, что сеть обычно штука медленная.

mutation observer ловит изменения, делает проверку и заполняет массив потоми делает запрос. Но тут почему то ajax не ждёт пока заполнится массив и сразу выполняет запрос.
К тому же эту проблему синхронный запрос не решит, он ее наоборот усугубит, так как MutationObserver так же не сможет отработать пока не завершится запрос.

Существуют ли случаи, когда оправдано использование синхронных запросов
единственное оправданное применение - отправка данных перед закрытием вкладки на динозаврах без поддержки sendBeacon
Заметьте, в современном fetch api даже нет такой возможности, как отправка синхронного запроса, и не просто так.

логика хромает и лучше всего все переписать
к сожалению появление асинхронности в одном месте может привести к появлению асинхронности во многих других местах, по другому ни как. Так что да, придется переписать. Но это неизбежно, так как многие api в современно браузере (тот же MutationObserver) работают только асинхронно. К счастью есть промисы и async/await сахар над ними, что сильно упрощает такую задачу.
Ответ написан
lssssssssssl
@lssssssssssl
Если выполнить синхронный Ajax-запрос, пользовательский интерфейс JS-приложения окажется заблокированным. Пользователь не сможет щёлкнуть по кнопке, ввести данные в поле, он не сможет даже прокрутить страницу. Синхронное выполнение Ajax-запросов не даст пользователю взаимодействовать с приложением. Такой подход хотя и возможен, но приводит к катастрофическим последствиям.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы