jQuery推迟了ajax执行顺序

时间:2016-07-27 18:31:33

标签: javascript jquery ajax promise deferred

我想用promises一个接一个地链接多个函数,每个函数都进行一次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>
&#13;
&#13;
&#13;

在调用myfunction1之前,我需要myfunction2的回调才能运行。 所以我需要这个订单:

myfunction1
myfunction1 done
myfunction2
myfunction2 done

但代码示例按此顺序运行:

myfunction1
myfunction2
myfunction1 done
myfunction2 done

任何帮助将不胜感激

解决方案:

不需要括号

myfunction1().then(myfunction2);

而不是:

myfunction1().then(myfunction2());

感谢@bergi

2 个答案:

答案 0 :(得分:0)

由于没有人将解决方案作为答案,我将这样做以便结束这个问题。

从此处更改您的代码:

myfunction1().then(myfunction2());

到此:

myfunction1().then(myfunction2);

您只需要将函数引用传递给.then(),以便在适当的时机调用函数LATER。当您将parens放在函数名后面时,您告诉JS解释器立即执行该函数,然后将返回结果作为.then()处理程序传递。这就是为什么它没有按照预期的顺序执行。

这是一个非常常见的错误。请记住,在函数名称后面放置parens会导致它立即执行。单独传递函数名称(没有parens)只会传递一个函数引用,稍后可以通过传递给它的函数/方法调用它(这就是你想要的)。

答案 1 :(得分:0)

您必须学习w.r.t许诺链接。您可以简单地做到这一点。

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

我还没有测试过,但是我希望它能工作。 如果可以,请接受它作为答案。