【问题标题】:How to use jQuery .When .done如何使用 jQuery .When .done
【发布时间】:2016-12-01 21:36:00
【问题描述】:

我正在尝试在另一个函数完成后运行一个函数。

 $.when(saveCanvas(canvas)).done(setWallPaper());

每个函数都可以单独运行,但是当我运行上面的代码时,它只运行第一个函数。

我需要改变什么?

【问题讨论】:

  • 在没有看到实际函数实现的情况下很难回答,但猜测$.when(saveCanvas(canvas)).done(setWallPaper);

标签: javascript jquery promise


【解决方案1】:

根据another SO question 的评论,$.when 期望延迟对象作为参数。如果您不传递任何内容,则将立即调用回调。

setWallPaper() 是否似乎没有工作,因为它实际上是在 saveCancas(canvas) 之前运行的? saveCanvas() 实际上不是 deferred objectwhen 期望它是。要使其成为延迟对象,请将dfr = $.Deferred(); 添加到您的saveCanvas() 函数的开头,并将return dfr.promise(); 添加到它的末尾。查看this SO answer了解更多详情。

function saveCanvas(canvas)
{
    dfr = $.Deferred();
    //Your code
    return dfr.promise();
}

阅读更多:http://api.jquery.com/jQuery.when/

【讨论】:

  • 你说得对,它立即运行,但传入画布似乎没有效果。
  • @PhilipK 编辑了我的答案以提出不同的解决方案
  • 请记住,promise 必须在某个时候解决,否则 done 回调将永远不会触发。
  • 这个答案对我非常有用。非常感谢!
【解决方案2】:

现在回想起来,这似乎是它与 jQuery 的工作方式:

function f1() {
	alert("function one");
}

$.when( f1() ).done(function() {
  alert("function 1 is done running function two");
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

注意:这与我在问题中发布的方法相同,因此基本上它应该有效。尽管 jQuery 在过去 3 年中可能发生了变化。很可能是调用函数的问题。

【讨论】:

    【解决方案3】:

    另一个疯狂的猜测:

    $.when(saveCanvas(canvas)).done(function(){
        setWallPaper()
    });
    

    【讨论】:

      猜你喜欢
      • 2020-01-09
      • 2012-09-10
      • 2023-04-08
      • 2016-09-25
      • 1970-01-01
      • 2014-11-07
      • 1970-01-01
      • 2012-12-24
      • 1970-01-01
      相关资源
      最近更新 更多