jQuery推迟了ajax执行顺序

jQuery deferred ajax execution order

本文关键字:执行 顺序 ajax 推迟 jQuery      更新时间:2023-09-26

我想用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(),这样它就可以在适当的时机调用函数LATER。当您将parens放在函数名之后时,您告诉JS解释器立即执行函数,然后将返回结果作为.then()处理程序传递。这就是为什么它没有按所需的顺序执行。


这是一个非常常见的错误。请记住,将parens放在函数名后面会使其立即执行。单独传递函数名(不带parens)只会传递一个函数引用,该函数引用稍后可以由传递给它的函数/方法调用(这正是您想要的)。

您必须学习w.r.t promise链接。你可以简单地这样做。

myFunctionA().then(()=> 
   return myFunB;
).then(()=> {
   //Do stuff after function b execution.`k`
}

我还没有测试过,但我希望它能起作用。如果有效,请接受它作为答案。