0

終了したDeferredを$.when()と同期するのに問題があります。解決または失敗したかどうかにかかわらず、すべての延期が終了したときに通知を受け取りたいです。

私の問題は、最初に起動するwhen()。always()が失敗し、他の遅延が完了するのを待たないことです。バグかどうかわからない。

例を作成しました。これがJsFiddleです:http: //jsfiddle.net/m3REv/

それからのjsコード:

/* 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();

出力は次のとおりです。

1 fail
w fail
w always
2 done
3 done
4

2 に答える 2

1

回避策:

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);

ソース

または何かのように考える

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");
});

ソース

于 2012-09-12T17:37:21.930 に答える
0

最後に、jQuery.when()のわずかに変更されたバージョンであるプラグインを作成しました。私はそれを徹底的にテストしていませんが、それは今のところフィドルと私の個人的な使用のために機能します。

プラグインと例のフィドルは次のとおりです。

http://jsfiddle.net/LTsLJ/

于 2012-09-13T08:52:16.500 に答える