paulenot
@paulenot
IT Issue

Как отключить асинхронность в JS?

Есть некая последовательность действий, которую нужно выполнить при нажатии кнопки "Показать". Ошибок не выводит, запрос возвращает. В основе функции jQuery.ajax с параметром async: false. Не получается сделать так, что бы при нажатии кнопки вывелась надпись о загрузке. Сейчас при нажатии кнопки ничего не происходит, пока не придет ответ сервера. А потом уже делает остальные действия. Часть кода перед отправкой запроса вообще не выполняется, пока запрос не придет...
'use strict';
$(document).ready(function($){
	// Нажатие кнопки "показать"
	$('.view_rating').on('click', function(e) {
		var rating_list = $('.rating_list');
		hide_message(rating_list);
		show_message(rating_list, 'Загрузка...', false);
		var result = load_json({
			action: 'view_rating',
			keywords: get_keywords(),
		});
		if (result == null){
			show_message(rating_list, 'Не удалось получить данные...', false);
		} else {
			hide_message(rating_list);
			show_result(rating_list, result);
		}
	});
});
  • Вопрос задан
  • 701 просмотр
Пригласить эксперта
Ответы на вопрос 2
Никак не отключить асинхронность, яваскрипт однопоточный, асинхронный.
Все коллбеки, fetch и многое другое выполняются асинхронно.
Вы привели кусок кода по которому читающий должен чудным образом догадаться что происходит например внутри hide_message, show_message, load_json
Основной вопрос к load_json, что эта функция возвращает?
Если Promise, то почитайте https://habr.com/ru/company/vk/blog/269465/
Ну и судя по вопросу вам не помешает просто почитать от корки до корки
https://learn.javascript.ru/
Ответ написан
@GrayHorse
Как отключить асинхронность в JS?

Например, с помощью синхронного XMLHttpRequest, что в приведенном примере кода как раз таки и сделано.
Всё (весь коллбек на событие клика) выполняется синхронно в рамках одной макро-задачи.

Т.е., внезапно, наоборот, — чтобы все работало, как задумано, надо включить асинхронность, а, точнее, не выключать ее. Ибо изменения в DOM происходят после завершения макро-задачи.

Первое изменение DOM (вывод текста загрузки) затирается сразу же изменением DOM, которое выводит данные полученного JSON.

И первое изменение DOM не может отрендериться, т.к. эвент луп заблокирован синхронным запросом. Оно ждет завершение запроса, а после него уже происходит другое, затирающее изменение.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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