0

2 つのデータに対して 2 つの AJAX 要求を行いたいと思います。要求の 1 つまたは両方が失敗する可能性があります。その場合でも、両方のリクエスト (または成功したリクエスト) からのデータを操作したいと思います。

私が次のようなことをした場合:

$.when($.get("page1"), $.get("page2")).then(function(a1, a2) {

})

このthen関数は、両方のリクエストが成功した場合にのみ呼び出されるため、一方が失敗すると、成功したリクエストからデータを取得できません。次に、failCallback を使用するか、always メソッドを使用すると、次のようになります。

$.when($.get("page1"), $.get("page2")).then(function(a1, a2) {
    console.log("this is only called if both succeed.");
}, function(a1, a2, a3) {
    console.log("this is only called with a then() failure");
}).always(function(a1, a2, a3) {
    console.log("this will fire when always() does.");
});

failCallback と always コールバックは、失敗したリクエストに関するデータのみを報告するため、成功したリクエストに関するデータを取得できません。同様に、リクエストの 1 つが失敗した場合、遅延された done() を使用しても呼び出されません。そのため、1 つのリクエストが 404 になると、成功した関数からデータを取得できないという状況があります。

遅延オブジェクトを切り離すことができると思うので、両方が when ループに含まれているわけではありません。ただし、続行する前に両方が終了することを確認するという問題に遭遇します。

4

2 に答える 2

1

オプションは次のとおりです(jQueryの遅延ツールを使用しないでください)

var NUM_CALLS = 2, count = 0, results = [], errors = [];
function callback(err, data) {
  count++;

  if (err){
    errors.push(err);
  }

  if (data){
    results.push(data);
  }

  if (count === NUM_CALLS) {
    done(errors,results);
  }
}


function ajax(url) {
  $.ajax({
    type: 'GET',
    url: url,
    success: function(){ return callback(null, arguments); },
    error: function(){ return callback(arguments, null)
  });
}

ajax('page1');
ajax('page2');

// now you have the errors and results
function done(errors, results) {

}
于 2012-12-24T03:21:56.820 に答える
0

ユーティリティ メソッド$.get()は成功のコールバックのみを提供しますが、低レベル$.ajax()では成功、エラー、および常にコールバック (またはそれら.done()に相当するもの).fail()を提供します。.then()独自の Deferred を (.get() ごとに) 解決することで、ajax が成功するか失敗するかに関係なく、必要な制御を取得できます。

コードを定式化するには多くの方法があるはずです。これはアダプタ関数を含むもので、liberalGet()常に解決され、$.ajax()結果に関係なく拒否されることのない自由化された promise を返します。

function liberalGet(url) {
    var dfrd = $.Deferred();
    $.ajax({
        url: url
    }).then(dfrd.resolve);
    return dfrd.promise();
}

$.when(liberalGet("page1"), liberalGet("page2")).done(function(a1, a2) {
    var textStatus = [ a1[1], a2[1] ];//"success", "notmodified", "error", "timeout", "abort", or "parsererror".
    console.log(textStatus.join(', '));
});

ご覧のとおり、引数a1[1]によってa2[1]、各 ajax レスポンスの textStatus にアクセスできます。a1[0]a2[0]jqXHR オブジェクト (およびそのプロパティ) にアクセスできます。したがって、アプリケーションの必要に応じて、ハンドラー内でループおよび分岐できます。

于 2012-12-25T07:54:57.547 に答える