jQuery.when()にdeferredsを配列で渡したい
環境
- jQuery 1.10.2
方法
以下に方法が載っています。
書いてみると以下のような感じ。
$(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.Deferred超入門 - Yahoo! JAPAN Tech Blog
- jQueryのDeferredを用いたモダンなAjax処理の書き方 - Hack Your Design!
- jQuery.when() | 私的なjQuery他
さいごに
jQuery.when()に配列でdeferredを渡した場合、どうやって実行結果を受け取るのか分からなくて苦しんだのですが、argumentsを使う以外の方法が分かりませんでした。
なんかイマイチな気もするのですが…。