jQuery.when()にdeferredsを配列で渡したい

はじめに

 jQuery.when()に決まった数のdeferredを渡すのは調べたら簡単に分かったのですが、不定数のdeferredを渡す方法を調べたら、意外と日本語では見つからなかったためメモ。

環境

方法

 以下に方法が載っています。


書いてみると以下のような感じ。

$(document).on("ready",
    function(){
        var funcA = function() {
            var dfd = $.Deferred();
            setTimeout(function(){
                console.log('a');
                dfd.resolve(1,'a');
            }, 1);
            return dfd.promise();
        };

        var funcB = function(){
            var dfd = $.Deferred();
            setTimeout(function(){
                console.log('b');
                dfd.resolve(2,'b');
            }, 1);
            return dfd.promise();
        };

        var funcArray = [];

        funcArray[0] = funcA();
        funcArray[1] = funcB();
        //以下のように書くと期待通りに動作しない(deferredの配列にならないので、当然と言えば当然ですが)。
        //funcArray[0] = funcA;
        //funcArray[1] = funcB;


        $.when.apply(null, funcArray).then(
                function(){
                    console.log("when :" + arguments[0][0] + " " + arguments[0][1]);
                    console.log("when :" + arguments[1][1] + " " + arguments[1][1]);
                }
            );

    }
);

そもそもjQuery.Deferred自体について

最初はjQuery.Deferred自体についてあまりよくわからなくて、以下を参照して勉強しました。

さいごに

 jQuery.when()に配列でdeferredを渡した場合、どうやって実行結果を受け取るのか分からなくて苦しんだのですが、argumentsを使う以外の方法が分かりませんでした。
 なんかイマイチな気もするのですが…。