【问题标题】:$.when vs Q.when behavior with Deferreds$.when 与 Q.when 的延迟行为
【发布时间】:2014-03-01 08:18:32
【问题描述】:

我正在使用 Q.js 库来做承诺。我尝试了以下场景,其中一个函数在执行某些代码之前等待另一个函数来解决延迟问题,并且它与 jQuery 本机承诺一起工作得很好。但是,相同的代码会立即在 Q.js 中返回。有什么想法吗?

小提琴:http://jsfiddle.net/ArN8F/5/


HTML:

<button id='go'>Go</button>
<p id='txt'></p>
<p id='txt2'></p>

jQuery 代码(等待 2 秒然后更改文本):

$(document).ready(function () {
    var dfd = $.Deferred();
    $('#go').click(function () {
        $('#txt').text('Clicked!');
        promised();
        setTimeout(dfd.resolve, 2000);
    });

    function promised() {
        $.when(dfd).done(function () {
            $('#txt2').text('Done');
        });
    }
})

Q.js 代码(立即更改文本):

$(document).ready(function () {
    var dfd = Q.defer();
    $('#go').click(function () {
        $('#txt').text('Clicked!');
        promised();
        setTimeout(dfd.resolve, 2000);
    });

    function promised() {
        Q.when(dfd, function () {
            $('#txt2').text('Done');
        });
    }
})

【问题讨论】:

  • 可能已经意外解决了?如果在 click 事件中创建了一个 new deferred,会发生什么?此外,在 jQuery 中与 Q.when(dfd, ..) 等效的是 dfd.then(..),而 not $.when(它是等效于 Q.all 的聚合器)。
  • 不,就这么简单。我什至使用过 Q.all,在这种情况下它永远不会返回。检查我刚刚添加的小提琴。

标签: jquery promise q


【解决方案1】:

我猜,你应该像这样使用Q.when

Q.when(dfd.promise, function () { 
     // .. 
});

请注意,它是dfd.promise,而不仅仅是dfd

工作demo

【讨论】:

  • 谢谢。我不敢相信是这样的。 Q 要求 .promise 实在是太蹩脚了。
  • 同意,但你可以试试看。至于我,我更喜欢 jQuery 的延迟对象。
猜你喜欢
  • 2013-09-07
  • 1970-01-01
  • 2017-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-18
  • 1970-01-01
  • 2017-07-28
相关资源
最近更新 更多