10

「foo」と「bar」の同時リクエストが正常に完了した後に何かを実行するシナリオを想像してみてください。または、どちらかまたは両方が失敗した場合にエラーを報告します。

$.when($.getJSON('foo'), $.getJSON('bar'))
  .then(function(foo, bar) {
    console.log( 'I fire if BOTH requests are successful!' );
  })
  .fail(function() {
    console.log( 'I fire if one or more requests failed.' );
  });

1) 'foo' のリクエストが失敗したか、2) 'bar' のリクエストが失敗したか、または 3) 両方が失敗したかを判断するにはどうすればよいですか?

4

3 に答える 3

11

から返された各 promise に fail 呼び出しを追加するだけです$.getJSON

function make_error_handler(msg) {
    return function() { console.log(msg); };
}

$.when($.getJSON('foo').fail(make_error_handler("foo failed"))
            , $.getJSON('bar').fail(make_error_handler("bar failed")))
  .then(function(foo, bar) {
    console.log( 'I fire if BOTH requests are successful!' );
  })
  .fail(function() {
    console.log( 'I fire if one or more requests failed.' );
  });

よりきめ細かな制御が必要な場合は、オーバーロード$.getJSONして追加情報を fail 関数に返すことができます。jQuery のドキュメントを参照してください。deferred.rejectWith

于 2011-04-26T19:01:26.900 に答える
1

jQuery.whenのドキュメントから

Deferredの1つが拒​​否された複数のDeferredの場合、jQuery.whenはマスターDeferredのfailCallbacksをすぐに起動します。一部の延期は、その時点でまだ解決されていない可能性があることに注意してください。この場合、未完了のajaxリクエストをキャンセルするなど、追加の処理を実行する必要がある場合は、基になるjqXHRオブジェクトへの参照をクロージャに保持し、failCallbackでそれらを検査/キャンセルできます。

つまり、各リクエストへの参照を保持し、必要に応じて手動で確認する必要があります。

難しいのは、failコールバックが呼び出されたときに、任意の数の遅延が未処理である可能性があるため、その状態では失敗も成功もしていないことです。

この場合、フェイルハンドラーに何が渡されるかについて、ドキュメントでもう少し詳しく説明されていることを望みます。ただし、ソースコードから判断すると、失敗ハンドラーが受け取る引数は、どちらのDeferredが最初に失敗するかによって異なるようです。

args[ i ].promise().then( resolveFunc(i), deferred.reject );

私はjQuery内部の専門家ではありませんが、これにより、各Deferredrejectが、通常ハンドラーに渡す引数を使用して「マスター」Deferredメソッドを呼び出すことができるようになると思います。あなたが私に尋ねるなら、理想的ではありません...しかし、私はこれを誤解している可能性があります。

私は彼らがこれを意味したのだろうかと思います:

args[ i ].promise().then( resolveFunc(i), func() { deferred.reject(args); } );
于 2011-09-14T11:39:35.710 に答える
0

を呼び出し.isResolved()て、リクエストが実際に完了したかどうかを確認できますが、問題は、いずれかの.when()リクエストが失敗するとすぐに失敗するため、他のリクエストが失敗しようとしているかどうかを確実に判断できないことです。

同様の質問に投稿したばかりの回答は、AJAX クエリごとに追加を作成することで、この要件を解決すると信じています (しゃれは意図していません) 。これにより、両方の AJAX 呼び出しの実際の結果がわかるまで待つことができます。$.Deferred

于 2011-04-28T21:34:51.007 に答える