Deferred の配列を $.when() に渡す 質問する

Deferred の配列を $.when() に渡す 質問する

ここで、何が起こっているかを示す不自然な例を示します。http://jsfiddle.net/adamjford/YNGcm/20/

HTML:

<a href="#">Click me!</a>
<div></div>

JavaScript:

function getSomeDeferredStuff() {
    var deferreds = [];

    var i = 1;
    for (i = 1; i <= 10; i++) {
        var count = i;

        deferreds.push(
        $.post('/echo/html/', {
            html: "<p>Task #" + count + " complete.",
            delay: count
        }).success(function(data) {
            $("div").append(data);
        }));
    }

    return deferreds;
}

$(function() {
    $("a").click(function() {
        var deferreds = getSomeDeferredStuff();

        $.when(deferreds).done(function() {
            $("div").append("<p>All done!</p>");
        });
    });
});

すべての遅延タスクが完了した後に「すべて完了しました!」と表示される$.when()ようにしたいのですが、Deferred オブジェクトの配列の処理方法がわからないようです。配列は Deferred オブジェクトではないため、「すべて完了しました!」が最初に表示され、jQuery は先に進んで完了したと想定します。

次のようにオブジェクトを関数に渡すことができることはわかっています$.when(deferred1, deferred2, ..., deferredX)が、実際に解決しようとしている問題で実行時に Deferred オブジェクトがいくつあるかは不明です。

ベストアンサー1

通常、値の配列を個別のパラメータとして渡すことが想定されている関数に渡すには、 を使用しますFunction.prototype.applyこの場合は、次のようになります。

$.when.apply($, my_array).then( ___ );

見るhttp://jsfiddle.net/YNGcm/21/

ES6では、... スプレッド演算子その代わり:

$.when(...my_array).then( ___ );

どちらの場合でも、ハンドラーに必要な正式なパラメーターの数が事前にわかる可能性は低いため、そのハンドラーは各プロミスの結果を取得するために配列.thenを処理する必要があります。arguments

おすすめ記事