問題は.done()
、新しいプロミスを返さないことです。いくつかのハンドラーを受け入れて、同じプロミスを返すだけです。jQuery の promise は非常に壊れています (「jQuery の Promise 実装に関する注意」を参照してください)。他のほとんどすべての promise ライブラリでは、.done
同様に動作し.then
ますが、戻りundefined
、エラー メッセージが沈黙していないことを確認します。jQuery では、チョコレート ファイア ガードと同じくらい便利です。
変換として機能するメソッドがあります(配列の場合と.then
少し似ています)。.map
これを考慮すると、次のことができます。
var promises = objects.map(function(obj) {
return $.ajax({
url: 'myurl' + obj.id,
dataType: 'jsonp'
});
});
var everything = $.when.apply($, promises).then(function() {..});
$.when(everything).done( function() { business logic });
everything
はすでにプロミスで$.when(everything)
あり、単なるパススルーであるため、実際には次のように書くことができることに注意してください。
everything.done(function () { business logic })
jQuery の Promise 実装に関する注意
jQuery の promise の実装がかなり壊れていることは注目に値します。他の Promise 実装の大部分で使用されているPromises/A+仕様には準拠していません。Promises/A+ は非常によく考えられており、多くのハードワークと実験の結果です。この仕様からの jQuery の逸脱は、多くの場合、使用を著しく困難にします。
別の実装 (例: Qまたは自分のpromise )を使用する場合は、次のようにすることができます。
Q($.ajax({
url: 'myurl' + obj.id,
dataType: 'jsonp'
}));
また
var Promise = require('promise');
Promise.from($.ajax({
url: 'myurl' + obj.id,
dataType: 'jsonp'
}));
jQuery から実際の Promises/A+ の Promise を取得します。