Как заставить код ждать при вызове асинхронных вызовов, таких как 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-вызов..Также это может быть плохой практикой, но стоит знать и попробовать, если это возможно...

382   4  

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

    Ничего не найдено.