【问题标题】:jQuery deferred - done not workingjQuery延迟 - 不工作
【发布时间】:2016-07-15 11:32:18
【问题描述】:

我正在尝试学习 jQuery deferred 并在我的代码中实现它。

function function1() {
  $deferred = $.Deferred();
  setTimeout(function() {
    alert("Hello");
  }, 3000);
  return $deferred.promise();
}

function function2() {
  alert('done');
}
$("button").click(function() {
  function1().done(function2());
});

我有一个简单的函数function1function2,我希望在执行function1 之后调用function2,但我无法得到结果。 谁能指出我到底做错了什么。

我使用 jquery-1.10.js 作为我的版本

谢谢。

【问题讨论】:

  • 你为什么使用这么旧的jQuery版本?即使您想保留非常旧的浏览器兼容性,您至少可以使用最新的 1.x 版本。

标签: jquery jquery-deferred


【解决方案1】:

你已经很接近了。

你需要resolve你的承诺并使用.then:-

function function1() {
   $deferred = $.Deferred();
   setTimeout(function() {
     alert("Hello");
     $deferred.resolve();
   }, 3000);
   return $deferred.promise();
 }

 function function2() {
   alert('done');
 }
 $("button").click(function() {
   function1().then(function2);
 });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<button>call</button>

【讨论】:

  • 呃,这里没有理由使用$.when(),实际上推荐它是浪费和错误的。你可以直接做function1().then(...)。另外,我强烈推荐使用 ES6 标准 .then() 而不是 jQuery 专有的 .done()。在 jQuery 3.x 中两者之间的行为有一个重要区别,因为 jQuery 使 .then() 与 ES6 承诺标准更加兼容。
【解决方案2】:

你有几个问题:

  1. 您从未解决您的延期问题。您必须调用 def.resolve() 以通知 Promise 侦听器该 Promise 现已解决。
  2. function1().done(function2()); 必须是 function1().done(function2);。当你在function2() 之后有括号时,它告诉 JS 解释器立即调用函数并传递返回值undefined。如果没有括号,则将函数的引用作为 .done() 处理程序传递,因此承诺基础架构可以稍后调用它(这就是您想要的)。

我建议使用以下代码:

function function1() {
    return $.Deferred(function(def) {
        console.log("start of function1");
        setTimeout(function() {
            console.log("timer fired");
            def.resolve();
        }, 3000);
    }).promise();
}

function function2() {
  console.log('done');
}
$("button").click(function() {
    function1().then(function2);
});

除了修复上述问题外,这也发生了变化:

  1. 它使用延迟构造函数。这样可以节省一些代码(使用更少的中介),并且更符合 ES6 Promise 规范并受 jQuery 支持。
  2. 它使用.then() 代替jQuery 专有的.done(),它更符合ES6 Promise 规范并受jQuery 支持。

我还建议您升级到更新版本的 jQuery,因为 1.10 到现在已经 3 年多了。如果你绝对要保持与旧版本 IE 的兼容性,你至少可以使用 1.12.4。

【讨论】:

    猜你喜欢
    • 2011-08-06
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    相关资源
    最近更新 更多