当前位置: 首页 > 知识库问答 >
问题:

进行两个jQuery AJAX调用,并获取两个调用的上下文,即使其中一个失败

何志业
2023-03-14

我想要两个对数据发出两个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和always callback只报告失败请求的数据,因此我无法获取成功请求的数据。类似地,如果其中一个请求失败,则使用done()deferred不会调用。所以有一种情况,如果一个请求404,我无法从成功的函数中获得任何数据。

我想我可以解耦延迟,这样它们就不会都在时间循环中。然而,我遇到了确保两者在继续之前完成的问题。

共有2个答案

汲睿
2023-03-14

实用程序方法$.get()只提供成功回调,而低级的$.ajax()提供成功、错误和始终回调(或它们的.done().fail().then()等同物)。通过解决自己的延迟问题(针对每个wouldbe.get()),无论ajax成功与否,都可以获得所需的控制。

制定守则的方法必须多种多样;这里有一个涉及适配器函数liberalGet()。

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响应的textStatusa1[0]a2[0]允许您访问jqXHR对象(及其属性)。因此,您可以根据应用程序的需要在处理程序内循环和分支。

常元章
2023-03-14

这里有一个选项(很抱歉没有使用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) {

}
 类似资料:
  • 基本上,我想调用一个API两次,创建一个包含两个响应的数组[res1,res2],然后对这个数组进行操作。我的代码是这样的: 不幸的是,这种方法不起作用。我得到数据[0]和数据[1]的未定义属性。然而,如果我只进行一次API调用,那么一切都可以正常工作。我想知道我的语法是否错误,还有什么好的方法来实现这一点?谢谢

  • 我在Angluar2应用程序中遇到了一个问题。假设我需要进行两个单独的http调用。一个调用直接取决于另一个调用的结果。代码如下所示: 有嵌套的订阅()调用,我想摆脱。

  • 我有一个包含可重用方法的键类。我尝试用两种方法使用WebElement。他们在一起。我知道失败的是webelement,因为我可以在没有两种方法的情况下对其进行编码,而且效果很好。当调用包含webelement的方法时,如何正确地执行此操作而不会失败?(无此类元素例外) 公开类密钥{ 另一个类使用如下内容:

  • 假设我有一种情况,我 ;调用两个存储库来获取项目。 当这两个都完成并反馈结果时,我怎样才能得到反馈呢?传统上,我会一个一个地调用这两个,然后再做剩下的逻辑。在这里,我想加快这个过程。 I ;试图做thenCombine()这样的事情,但两者都是不同的对象,我无法在这个lambda中写入逻辑。有谁能提出更好的方法吗?

  • 我知道我可以这样用一个根上下文写两个dispatchers servlet: @override public void onStartup(ServletContext ServletContext)抛出ServletException{ } 但是我如何使用AbstractAnnotationConfigDispatcherServletInitializer来实现这一点呢?如果不可能--为什么

  • 当有两个公共方法并且一个方法调用同一个类中的另一个公共方法时,测试方法的方法是什么? 在这种情况下,我应该如何编写单元测试? 一个例子 这个例子并没有显示所涉及的方法的复杂性,而是概念的复杂性。 我应该分别测试加法和乘法吗?如果我只测试乘法,我觉得我们错过了不能提供参数的情况。 假设要分别测试和,我应该能够模拟?这怎么可能? 假设要分别测试乘法和加法,我不应该模拟,我应该让加法按原样执行吗。如果是