jQuery の Deferred でのエラー処理 その(3)

この内容は jQuery 1.7.2 を元に記述しています。

最後は $.when を見ていきます。若干残念な気分になっていたので最後こそはと期待していたのですが、結論としてはやっぱり残念な気分のままでした。

さて、$.when ですが、引数に指定した deferred を並列で全部実行した後に resolve してくれるみたいです。

$.when(
    async("Test 1", 1000),
    async("Test 2", 500),
    async("Test 3", 2000)
).done(function(){
    console.log("done - " + JSON.stringify(arguments));
});

f:id:k_maru:20120624005341p:plain

done の引数には、結果が順番に渡されるようですね。で、エラーが発生した場合ですが、非常に悲しい感じです。

$.when(
    async("Test 1", 1000),
    async("Test 2", 500, true), //ここでエラー
    async("Test 3", 2000)
).done(function(){
    console.log("done - " + JSON.stringify(arguments));
}).fail(function(){
    console.log("fail - " + JSON.stringify(arguments));
});

f:id:k_maru:20120624005553p:plain

reject された時に、すぐに fail が走ってます。。まぁ、確かにドキュメントにはそういう風に記述されているのですが。。

The method will resolve its master Deferred as soon as all the Deferreds resolve, or reject the master Deferred as soon as one of the Deferreds is rejected.

http://api.jquery.com/jQuery.when/

なにが問題かっていうと、複数エラーが発生する場合はどうするのよってところですね。あと、成功した内容も取得できないので pipe と同じように個別に then とかで成功した内容を変数にとっておかなければなりません。でも、失敗より後に成功が発生する可能性があるので、成功した内容をとっている変数の確認タイミングも工夫しなダメなんですよね。

ちょっと、どんな感じになるか書いてみようかと一瞬思いましたが、どう考えてもめんどくさい処理なのでやめときます。

ということで、 $.when での嬉しさがでるのは「一気に処理したくて完了したタイミングを知りたい。で、途中でエラーがおこってもその事実が分かればよくって、成功した内容は捨てられても、エラー後のほかの処理の継続も垂れ流されて OK」みたいな時くらいでしょうか。

pipe も $.when もそのままでは使えない感じですね。