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`
}

我还没有测试过,但我希望它会起作用。 如果有效,请采纳为答案。