0

私は次のコードを持っています:

var aReq = $.getJSON('/path/A'),
    bReq = $.getJSON('/path/B');

$.when(aReq, bReq).then(function(A, B) {
  console.log(A, B);
  // logs: [Array[5], "success", Object], [Array[20], "success", Object]
});

これが「jqXHR配列」にラップされているのはなぜですか?

シングルで$.getJSONはこれは起こりません:

var aReq = $.getJSON('/path/A');
$.when(aReq).then(function(A) {
  console.log(A);
  // logs: [Object, Object, Object, Object, Object]
  // just like I wanted it in the first version
});

最初のバージョンが機能することを達成する方法はありますか?たぶん私は約束/延期されたオブジェクトに何か問題があることを理解しました。

FWIW:この場合はjQueryバージョン1.7.1を使用しています。

4

1 に答える 1

2

これは、意図された動作としてAPIに十分に文書化されています:http://api.jquery.com/jQuery.when/

配列で返されなかった場合、渡されたpromiseごとに異なる結果が返されるのは、渡されたpromiseごとに複数の引数が返される可能性があることを考慮した場合です。

ドキュメントから:

単一の引数がjQuery.whenに渡され、それがDeferredまたはPromiseでない場合、それは解決されたDeferredとして扱われ、アタッチされたdoneCallbacksはすぐに実行されます。doneCallbacksには元の引数が渡されます。この場合、Deferredが拒否されることはないため、設定したfailCallbacksが呼び出されることはありません。

複数のDeferredオブジェクトがjQuery.whenに渡される場合、メソッドは、渡されたすべてのDeferredの集約状態を追跡する新しい「マスター」DeferredオブジェクトからPromiseを返します。このメソッドは、すべての遅延が解決されるとすぐにマスター遅延を解決するか、いずれかの遅延が拒否されるとすぐにマスター遅延を拒否します。マスターDeferredが解決されると、jQuery.whenに渡されたすべてのDeferredの解決された値が渡されます。たとえば、DeferredsがjQuery.ajax()リクエストの場合、引数は、引数リストで指定された順序で、リクエストのjqXHRオブジェクトになります。

于 2013-02-14T15:57:48.967 に答える