powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / JavaScript: Порядок выполнения методов при синхронном вызове.
11 сообщений из 11, страница 1 из 1
JavaScript: Порядок выполнения методов при синхронном вызове.
    #40064171
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте. Есть метод, который:

1) Записывает значение в текстовое поле на HTML-странице
Код: javascript
1.
document.getElementById('textID').value = 'Пожалуйста, подождите...';



2) Выполняет синхронный вызов другого метода через JQuery.Ajax:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
$.ajax({
        type: 'POST',
	 url: getHostName() + 'usedAddDays.aspx/getUsedAddDays',	
        data: '{udObject: ' + JSON.stringify(udObject) + '}', 
 contentType: 'application/json; charset=utf-8',
    dataType: 'json',
       async: false,
     success: function(response){
		 s = response.d;
	      },
       error: function(jqXHR, exception){ console.log('error'); }				   
});	


Проблема в том, что метод из Шага 2 выполняется первее чем метод из шага 1 .
И в итоге, я сначала жду 3-4 секунды когда выполнится метод (шаг2), а потом вижу отрисовку "Пожалуйста, подождите..."

Асинхронным шаг 2 сделать не могу, т.к. данные из вызывающей процедуры будут получены не своевременно, а мне нужно гарантированно их там получить.

Подскажите, как можно сначала гарантированно заполнить поле, а потом вызвать синхронный метод?
...
Рейтинг: 0 / 0
JavaScript: Порядок выполнения методов при синхронном вызове.
    #40064176
Alexander A. Sak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно как-то так:
Код: javascript
1.
2.
3.
4.
5.
document.getElementById('textID').value = 'Пожалуйста, подождите...';

setTimeout(function() {
  // тот самый ajax
}, 1)



Но это говнокод, и так делать нельзя. Завтра отменять синхронный ajax, и все ухищрения пойдут лесом.
...
Рейтинг: 0 / 0
JavaScript: Порядок выполнения методов при синхронном вызове.
    #40064179
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander A. Sak

Но это говнокод


и он не работает.

Я уже пробовал такой вариант. Блок внутри setTimeout начинает выполняться, происходит выход из функции, получаю пустой результат (т.к. метод только начал выполняться). Пустой результат возвращается в вызывающую процедуру, а тем временем синхронный метод закончил отработку, вернув нужный результат в никуда.
...
Рейтинг: 0 / 0
JavaScript: Порядок выполнения методов при синхронном вызове.
    #40064190
Alexander A. Sak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если таймаут увеличить до заметных 5-10 секунд. Все равно "подождите..." появляется после завершения ajax?
...
Рейтинг: 0 / 0
JavaScript: Порядок выполнения методов при синхронном вызове.
    #40064193
Alexander A. Sak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное, проблема в обработчике success, где делается s = response.d; , которое к тому моменту не нужно.

Обломс-с. Но можно только замазать проблему синтаксисом async/await.
...
Рейтинг: 0 / 0
JavaScript: Порядок выполнения методов при синхронном вызове.
    #40064195
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULER
и он не работает

Это ты им не правильно пользуешься...

MAULER
Я уже пробовал такой вариант. Блок внутри setTimeout начинает выполняться, происходит выход из функции, получаю пустой результат (т.к. метод только начал выполняться). Пустой результат возвращается в вызывающую процедуру, а тем временем синхронный метод закончил отработку, вернув нужный результат в никуда.

Все это, тобой описанное, нужно делать в том setTimeout()...
Тогда все будет возвращаться туда, куда нужно.

Ты показал всего 2 куска - тебе Alexander A. Sak про них и написал. Далее ты сам должен был правильно понимать как работает setTimeout() и "достать" то, что ты от нас утаил...

В следующий раз делай полные тестовые примеры - на них тебе можно будет показать работающие варианты.
...
Рейтинг: 0 / 0
JavaScript: Порядок выполнения методов при синхронном вызове.
    #40064197
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если "код 2" делается гарантированно долго - можно вот это
MAULER

Код: javascript
1.
document.getElementById('textID').value = 'Пожалуйста, подождите...';



Поместить в setTimeout() до выполнения "кода 2"...
Т.е. нужно разделять потоки. Вывод и рассчет должны выполняться в разных потоках.
...
Рейтинг: 0 / 0
JavaScript: Порядок выполнения методов при синхронном вызове.
    #40064605
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa
Если "код 2" делается гарантированно долго - можно вот это
MAULER

Код: javascript
1.
document.getElementById('textID').value = 'Пожалуйста, подождите...';



Поместить в setTimeout() до выполнения "кода 2"...
Т.е. нужно разделять потоки. Вывод и рассчет должны выполняться в разных потоках.


Я так и сделал. Ни с паузой 5 сек. ни с нулевой - нет нужного эффекта.

Я могу ошибаться, но судя по всему setTimeout врубает асинхрон, в котором моя s не успев получить значение от AJAX-а
вылетает из функции сообщает "пустышку" вызывающей процедуре. А когда значение от AJAX-а получено - отрисовывает "Пожалуйста, подождите"
...
Рейтинг: 0 / 0
JavaScript: Порядок выполнения методов при синхронном вызове.
    #40064606
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander A. Sak
Наверное, проблема в обработчике success, где делается s = response.d; , которое к тому моменту не нужно.

Обломс-с. Но можно только замазать проблему синтаксисом async/await.

а это как? Подскажите?
...
Рейтинг: 0 / 0
JavaScript: Порядок выполнения методов при синхронном вызове.
    #40064617
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULER,
А если сделать две отдельные функции и вызвать в одну ?
Код: javascript
1.
2.
3.
4.
function call() {
 function a();
 function b(); 
 }
...
Рейтинг: 0 / 0
JavaScript: Порядок выполнения методов при синхронном вызове.
    #40064624
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем!
Короче выкрутился и сделал проще:

Шаг 1) и Шаг 2) оставил без изменений, НО! $.ajax метод сделал асинхронным (async: true), а в success -функции добавил нужную отрисовку полученного (правильного!) результата.

В результате, что получилось:
Шаг1 ДО $.ajax -метода вполне себе успевает нарисовать "Пожалуйста, подождите..." т.к. асинхронный ajax (в Шаге 2) позволяет ей это сделать, начиная параллельно работать сам.

т.е. видим надпись, уходим в success-функцию для ожидания валидного резульата (в переменной s) и в ней же (дождавшись) значения - выводим его.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / JavaScript: Порядок выполнения методов при синхронном вызове.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]