进行两次jQuery AJAX调用并获取两者的上下文,即使一次失败也是如此

时间:2012-12-24 03:12:45

标签: jquery ajax jquery-deferred

我想要两个对数据进行两次AJAX请求。其中一个或两个请求可能会失败。在这种情况下,我仍然希望与来自两个请求(或成功请求)的数据进行交互。

如果我这样做:

$.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和始终回调仅报告失败请求的数据,因此无法获取有关成功请求的数据。同样,如果其中一个请求失败,则使用done()deferred不会调用。因此,如果一个请求404s,我无法从成功的函数中获取任何数据。

我想我可以解耦延迟,所以它们都不是在while循环中。然而,我遇到了确保在继续之前完成两个问题的问题。

2 个答案:

答案 0 :(得分: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) {

}

答案 1 :(得分:0)

实用程序方法$.get()仅提供成功回调,但低级别$.ajax()提供成功,错误和始终回调(或.done().fail(),{{ 1}}等价物)。通过解析你自己的Deferred(对于每个willbe .get()),无论ajax是成功还是失败,你都可以获得所需的控件。

制定代码必须有很多方法;这是一个涉及适配器函数.then()的函数,它返回一个自由化的promise,无论liberalGet()结果如何,它都会被解决并且永远不会被拒绝。

$.ajax()

如您所见,参数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]使您可以访问每个ajax响应的textStatus。 a2[1]a1[0]可让您访问jqXHR对象(及其属性)。因此,您可以根据应用程序的需要在处理程序内循环和分支。