Как заставить код ждать при вызове асинхронных вызовов, таких как Ajax [дубликат]
этот вопрос уже есть ответ здесь:
Как вернуть ответ из асинхронного вызова?
33 ответы
Я ищу что-то подобное
function someFunc() {
callAjaxfunc(); //may have multiple ajax calls in this function
someWait(); // some code which waits until async calls complete
console.log('Pass2');
}
function callAjaxfunc() {
//All ajax calls called here
console.log('Pass1');
}
что я пробовал?
1
Jquery.когда()
пробовал использовать it..it отлично работает. Но не так, как я хочу. $.when буду ждать, но код рядом с $.when() работает с ожиданием. Код внутри do callback работает только после ajax вызовов
2.
setTimeOut () с глобальным флагом
Я был так уверен, что это сработает. Я попробовал, как следование.
GlobalFlag = false;
function someFunc()
callAjaxfunc(); //may have multiple ajax calls in this function
setTimeOut(waitFunc, 100); // some which waits until async calls complete
console.log('Pass2');
}
function callAjaxfunc() {
//All ajax calls called here
onAjaxSuccess: function() {
GlobalFlag = true;
};
console.log('Pass1');
}
function waitFunc() {
if (!GlobalFlag) {
setTimeOut(waitFunc, 100);
}
}
все еще не в состоянии получить желаемый результат. Я делаю что-то не так здесь? Это не выход?
результат, который я хотел, должен был прийти так
Pass1
Pass2
не возможность сделать любую скрипку, как это нужно AJAX звонки
EDIT: как многие предлагали обратные вызовы..я знаю о них..но все же код рядом с somewait() будет выполняться...Я хочу, чтобы браузер полностью прекратил выполнение кода рядом с somewait() до тех пор, пока AJAX-вызов..Также это может быть плохой практикой, но стоит знать и попробовать, если это возможно...
4 ответов:
использовать обратные вызовы. Что-то вроде этого должно работать на основе вашего примера кода.
function someFunc() { callAjaxfunc(function() { console.log('Pass2'); }); } function callAjaxfunc(callback) { //All ajax calls called here onAjaxSuccess: function() { callback(); }; console.log('Pass1'); }выводит
Pass1немедленно (предполагая, что запрос ajax занимает по крайней мере несколько микросекунд), а затем распечататьPass2когдаonAjaxSuccessвыполняется.
почему это не работает для вас, используя
Deferred Objects? Если я не понял что-то неправильно, это может сработать для вас./* AJAX success handler */ var echo = function() { console.log('Pass1'); }; var pass = function() { $.when( /* AJAX requests */ $.post("/echo/json/", { delay: 1 }, echo), $.post("/echo/json/", { delay: 2 }, echo), $.post("/echo/json/", { delay: 3 }, echo) ).then(function() { /* Run after all AJAX */ console.log('Pass2'); }); };
обновление
на основе вашего ввода кажется, что ваша самая быстрая альтернатива - использовать синхронные запросы. Вы можете установить свойство
asyncдоfalseв своем$.ajaxзапросы на их блокировку. Это будет висеть ваш браузер до однако запрос завершен.обратите внимание, что я не рекомендую это, и я все еще считаю, что вы должны исправить свой код в рабочем процессе на основе событий, чтобы не зависеть от него.
настоящие программисты делают это с семафорами.
есть переменная, установленная в
0. Увеличьте его перед каждым вызовом AJAX. Уменьшите его в каждом обработчике успеха и проверьте для0. Если это так, то вы закончили.
Если вам нужно подождать, пока вызов ajax не будет завершен все, что вам нужно, это сделать ваш вызов синхронно.
Comments