[英]jQuery deferred ajax execution order
我想用诺言将多个功能一个接一个地链接,每个功能都进行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解释器立即执行该函数,然后将返回结果作为.then()
处理函数传递。 这就是为什么它没有按期望的顺序执行的原因。
这是一个非常常见的错误。 只要记住,将括号放在函数名称之后会立即执行它。 单独传递一个函数名(不带括号)将仅传递一个函数引用,该引用可以在以后某个时候被传递给它的函数/方法调用(这就是您想要的)。
您必须学习wrt promises链。 您可以简单地做到这一点。
myFunctionA().then(()=>
return myFunB;
).then(()=> {
//Do stuff after function b execution.`k`
}
我还没有测试过,但我希望它能起作用。 如果可行,请接受它作为答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.