1. ホーム
  2. javascript

[解決済み] Deferredsの配列を$.when()に渡す

2022-03-22 01:18:52

質問

以下は、その工夫の例です。 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>");
        });
    });
});

延期したタスクがすべて完了したら、"All done!" を表示させたいのですが。 $.when() はDeferredオブジェクトの配列をどのように処理すればよいのかわからないようです。

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

どのように解決するのですか?

に値の配列を渡すには 任意の 関数は、通常、個別のパラメータであることを期待します。 Function.prototype.apply が必要なので、この場合は

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

参照 http://jsfiddle.net/YNGcm/21/

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

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

どちらの場合でも .then ハンドラが必要とする場合、そのハンドラは arguments の配列で、各プロミスの結果を取得します。