6

$ .whenは、1つ以上のDeferredオブジェクトが渡されるかどうかによって動作が異なります。この動作はドキュメントに記載されていますが、問題は、2つの異なるコードパスを記述しなければならないことです。

function foo (dfds) {
    $.when.apply(this, dfds).done(function() {
        console.log(arguments);
    });
}

ケースI:

foo([$.getJSON("http://freegeoip.net/json/8.8.8.8"),
     $.getJSON("http://freegeoip.net/json/8.8.8.9")]);
....
/* Output (what I'd come to expect) */
[Array[3], Array[3]]

ケースII:

foo([$.getJSON("http://freegeoip.net/json/8.8.8.8")]);
....
/* Output (the original unwrapped deferred's arguments) */
[Object, "success", Object]

dfd長さやタイプをチェックせずにこれをエレガントに処理する方法はありargumentsますか?

4

3 に答える 3

4

延期されたオブジェクトの数を明示的にテストすることは避けられないと思います。延期されたオブジェクトを返したいと仮定します。

function foo (dfds) {
    if(dfds.length > 1) {
        return $.when.apply(this, dfds);
    }
    else {
        return dfds[0].pipe(function() {
            return [Array.prototype.slice.call(arguments, 0)]
        });
    }
}

この機能をラップして再利用可能にするjQueryプラグインを作成できます。

(function($) {
    $.when_ = function() {
        if(arguments.length > 1) {
            return $.when.apply(this, arguments);
        }
        else {
            return arguments[0].pipe(function() {
                return [Array.prototype.slice.call(arguments, 0)];
            });
        }
    };
}(jQuery));

オーバーライドすることもできます$.whenが、内部で使用されているかどうかはわかりません。

于 2012-08-21T08:39:37.087 に答える
1

jQueryには、引数ロジックをいじるという悪い癖があります。あなたの場合、遅延オブジェクトごとにコールバックが必要な場合は、単純なループで正規化されます。

$.each(dfds, function() {
    $.when(this).done(function() {
        console.log(arguments);
    });
});

引数をループして、配列を送信する必要がないようにすることもできます。

function foo() {
    $.each(arguments, function() {
        $.when(this).done(function() {
            console.log(arguments);
        });
    });
}

アップデート

常に遅延オブジェクトの配列を返したい場合は、fooFelixが投稿したように引数の長さを確認するか、次のようにする必要があります。

function foo() {
    $.when.apply(this, arguments).done(function() {
        var args = $.makeArray(arguments),
            result = args[0].constructor != Array ? [args] : args;
        console.log(result);
    });
}

http://jsfiddle.net/2ht8d/

于 2012-08-21T08:01:22.660 に答える
0

ダミーオブジェクトをdfds配列の最後にプッシュするだけです。これにより、少なくとも1つが延期されていると仮定すると、常に長さが2以上になります。

于 2012-08-21T16:32:18.363 に答える