繁体   English   中英

jQuery推迟了Ajax执行顺序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM