【问题标题】:jQuery deferred ajax execution orderjQuery延迟ajax执行顺序
【发布时间】:2016-12-01 22:02:28
【问题描述】:

我想用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

【问题讨论】:

  • .then(myfunction2()); 立即调用该函数并将结果承诺传递给then。你想传递一个回调:.then(myfunction2).
  • 哇,我差点错过这条评论,它解决了我的问题,非常感谢!
  • @inverz - 在这个网站上,您永远不应该将解决方案编辑到您的问题中 - 永远。问题是问题。如果没有其他人发布答案并且您找到了解决方案,您可以自己发布答案。或者,如果其他人已经发布了答案,那么您可以通过选中该答案旁边的绿色复选标记来接受该答案。这将向社区表明您的问题现已得到解答。

标签: javascript jquery ajax promise deferred


【解决方案1】:

您必须学习 w.r.t 承诺链。你可以这样做。

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

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

【讨论】:

    【解决方案2】:

    由于没有人将解决方案放入答案中,我会这样做以结束这个问题。

    从此更改您的代码:

    myfunction1().then(myfunction2());
    

    到这里:

    myfunction1().then(myfunction2);
    

    您只需将函数引用传递给.then(),以便它可以在适当的时机稍后调用该函数。当你把括号放在函数名后面时,你是在告诉 JS 解释器立即执行函数,然后将返回结果作为 .then() 处理程序传递。这就是它没有按所需顺序执行的原因。


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

    【讨论】:

      猜你喜欢
      • 2013-04-29
      • 1970-01-01
      • 2014-09-15
      • 2014-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-23
      相关资源
      最近更新 更多