首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同步延迟与时间

同步延迟与时间
EN

Stack Overflow用户
提问于 2012-09-13 00:21:39
回答 2查看 60关注 0票数 0

我在使用$.when()同步已完成的Deferreds时遇到了问题。我想要在所有延迟完成时得到通知,无论是解决还是失败。

我的问题是,当最初触发的().always()失败,而不等待其他延迟完成时。不确定这是不是个bug。

我做了一个例子,下面是一个JsFiddle:http://jsfiddle.net/m3REv/

其中的js代码:

代码语言:javascript
复制
/* our multiple deferred we'd like to sync. */
var def1 = $.Deferred();
var def2 = $.Deferred();
var def3 = $.Deferred();

def1.done( function() { logger.log('1 done');} ).fail( function() {logger.log('1 fail');} );
def2.done( function() { logger.log('2 done');} ).fail( function() {logger.log('2 fail');} );
def3.done( function() { logger.log('3 done');} ).fail( function() {logger.log('3 fail');} );

$.when( def1, def2, def3 ).then( function() {
    logger.log('w then');
} ).done( function() {
    logger.log('w done');
} ).fail( function() {
    logger.log('w fail');
} ).always( function() {
    logger.log('w always');
});


def1.reject();
def2.resolve();
def3.resolve();

输出结果为:

代码语言:javascript
复制
1 fail
w fail
w always
2 done
3 done
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-13 16:52:17

最后,我编写了一个插件,它是jQuery.when()的一个稍微修改过的版本。我还没有对它进行详尽的测试,但目前它适用于小提琴和我的个人使用。

以下是插件和示例之间的关系:

http://jsfiddle.net/LTsLJ/

票数 0
EN

Stack Overflow用户

发布于 2012-09-13 01:37:22

解决方法:

代码语言:javascript
复制
var defCount = 3, state = 0;
var overallAlways = function () {
    if (++state < defCount) return;
    logger.log('correct always');
};

def1.done( function() { logger.log('1 done');} )
    .fail( function() {logger.log('1 fail');} )
    .always(overallAlways);
def2.done( function() { logger.log('2 done');} )
    .fail( function() {logger.log('2 fail');} )
    .always(overallAlways);
def3.done( function() { logger.log('3 done');} )
    .fail( function() {logger.log('3 fail');} )
    .always(overallAlways);

Source

或者有人会这样想

代码语言:javascript
复制
function overallAlways(defObjects, callback) {
    var defCount = defObjects.length, state = 0;
    var alwaysCallback = function () {
        if (++state < defCount) return;
        callback.call(this);
    }
    $.each(defObjects, function (i, def) {
        def.always(alwaysCallback);
    });
}

var defs = [def1, def2, def3];
overallAlways(defs, function(){
    logger.log("overall always");
});

Source

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12392525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档