jQuery 推迟 ajax 执行顺序
jQuery deferred ajax execution order
我想用 promise 一个接一个地链接多个函数,每个函数都进行 AJAX 调用。
像这样:
function myfunction1() {
console.log("myfunction1");
return $.ajax({
url: "/"
}).always(function() {
console.log("myfunction1 done");
});
}
function myfunction2() {
console.log("myfunction2");
return $.ajax({
url: "/"
}).always(function() {
console.log("myfunction2 done");
});
}
myfunction1()
.then(myfunction2());
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
在调用 myfunction2
之前,我需要 myfunction1
对 运行 的回调。
所以我需要这个订单:
myfunction1
myfunction1 done
myfunction2
myfunction2 done
但是代码示例 运行 的顺序是:
myfunction1
myfunction2
myfunction1 done
myfunction2 done
任何帮助将不胜感激
解法:
不需要括号
myfunction1().then(myfunction2);
而不是:
myfunction1().then(myfunction2());
感谢@bergi
由于没有人将解决方案放入答案中,所以我将这样做以结束这个问题。
从这里更改您的代码:
myfunction1().then(myfunction2());
对此:
myfunction1().then(myfunction2);
您只需将函数引用传递给 .then()
,这样它就可以稍后在适当的时机调用该函数。当您将括号放在函数名称之后时,您是在告诉 JS 解释器立即执行该函数,然后将 return 结果作为 .then()
处理程序传递。这就是它未按所需顺序执行的原因。
这是一个很常见的错误。请记住,将括号放在函数名称之后会导致它立即执行。单独传递一个函数名称(没有括号)只会传递一个函数引用,稍后可以由您传递给它的 function/method 调用(这就是您在这里想要的)。
您必须学习 w.r.t 承诺链接。你可以简单地这样做。
myFunctionA().then(()=>
return myFunB;
).then(()=> {
//Do stuff after function b execution.`k`
}
我还没有测试过,但我希望它会起作用。
如果有效,请采纳为答案。
我想用 promise 一个接一个地链接多个函数,每个函数都进行 AJAX 调用。
像这样:
function myfunction1() {
console.log("myfunction1");
return $.ajax({
url: "/"
}).always(function() {
console.log("myfunction1 done");
});
}
function myfunction2() {
console.log("myfunction2");
return $.ajax({
url: "/"
}).always(function() {
console.log("myfunction2 done");
});
}
myfunction1()
.then(myfunction2());
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
在调用 myfunction2
之前,我需要 myfunction1
对 运行 的回调。
所以我需要这个订单:
myfunction1
myfunction1 done
myfunction2
myfunction2 done
但是代码示例 运行 的顺序是:
myfunction1
myfunction2
myfunction1 done
myfunction2 done
任何帮助将不胜感激
解法:
不需要括号
myfunction1().then(myfunction2);
而不是:
myfunction1().then(myfunction2());
感谢@bergi
由于没有人将解决方案放入答案中,所以我将这样做以结束这个问题。
从这里更改您的代码:
myfunction1().then(myfunction2());
对此:
myfunction1().then(myfunction2);
您只需将函数引用传递给 .then()
,这样它就可以稍后在适当的时机调用该函数。当您将括号放在函数名称之后时,您是在告诉 JS 解释器立即执行该函数,然后将 return 结果作为 .then()
处理程序传递。这就是它未按所需顺序执行的原因。
这是一个很常见的错误。请记住,将括号放在函数名称之后会导致它立即执行。单独传递一个函数名称(没有括号)只会传递一个函数引用,稍后可以由您传递给它的 function/method 调用(这就是您在这里想要的)。
您必须学习 w.r.t 承诺链接。你可以简单地这样做。
myFunctionA().then(()=>
return myFunB;
).then(()=> {
//Do stuff after function b execution.`k`
}
我还没有测试过,但我希望它会起作用。 如果有效,请采纳为答案。