JQuery продолжает выполнение другой функции ajax после того, как первый вызов функции ajax полностью завершен
У меня есть 2 вызова ajax в 2 разностных функциях. Я хочу использовать .click для вызова этих двух функций
, Func1 вставляет данные в базу данных, затем func2 должен извлекать данные, поэтому мой вопрос заключается в том, как подождать, пока func1 полностью завершит, тогда он выполнит func2.
Я пробовал .delay(), он работает, но я думаю, что это глупое решение.
$("#updateLocation").click(function(e){
e.preventdefault;
func1();
func2();
});
return false;
});
function func1(){
$.ajax({
url:'',
});
});
function func2(){
$.ajax({
url:'',
});
});
Ответы
Ответ 1
Три способа:
Вызвать func2 на успех func1:
function func1() {
$.ajax({ ... }).done(func2);
}
Используйте API Deferred
для вызова func2, когда funky завершает:
e.preventDefault();
$.when(func1).then(func2);
Сделайте func1 синхронным (не рекомендуется):
function func1() {
$.ajax({url: '', async: false});
}
Ответ 2
Так как Ajax-вызовы асинхронны, приложение не будет приостанавливаться до тех пор, пока не будет завершен вызов ajax, и просто сразу начните следующий вызов.
JQuery предлагает обработчик, вызываемый при успешном вызове, а другой - при возникновении ошибки во время вызова.
$.ajax({
url: 'ajax/test.html',
success: function(data) {
$('.result').html(data);
alert('Load was performed.');
},
error :function(jqXHR, textStatus, errorThrown)
{
alert("something went wrong");
}
});
Вы хотите вызвать свою вторую функцию AJAX из обработчика успеха.
Ответ 3
Переместить func2 внутри func1- > ajax- > succes callback
$("#updateLocation").click(function(e) {
e.preventdefault;
func1();
//func2();
});
return false;
});
function func1() {
$.ajax({
url: '',
success: function() { /* other stuff */
func2();
}
});
});
function func2() {
$.ajax({
url: '',
});
});
Ответ 4
Позвоните fun2 в успех func1
function func1(){
$.ajax({
url:'',
success:function(){
func2();
}
})
Ответ 5
Вы можете установить для опции "асинхронный" значение false (для первого вызова ajax).
Это означает, что функция 2 будет вызвана после того, как функция 1 получит ответ, то есть завершит его выполнение.
function func1(){
$.ajax({
url:'',
async: false
});
});
Ответ 6
вы также можете передать свою функцию как параметр:
var secondFunc = function (func) {
//Do ajax req or smt
func("answer", "params");
};
var firstFunc = function() {
secondFunc(
function (answerFromFunc2, paramsFromfunc2) {
var a = answerFromFunc2;
var b = paramsFromfunc2;
}
);
//Do smt after the function request to the server is done
var doSmt = "another func or variable";
};
firstFunc();