jquery 如何使用Deferred来处理多个应用程序请求错误?

0mkxixxg  于 2023-10-17  发布在  jQuery
关注(0)|答案(3)|浏览(118)

我在处理多个jQuery Ajax调用时遇到了一些问题,有超时错误,但我怎么知道这是哪个请求错误?

$.when(ajaxDeferred1, ajaxDeferred2)
  .done(function(result1, result2) {})
  .fail(function(response, statusText) {
  // how do I know which(ajaxDeferred1 or ajaxDeferred2) ajax call error this is?
});

[*]阿杰克斯德弗瑞德酒店**

$.ajax({
  method: 'GET',
  url: xxx,
  timeout: 5000,
});

我知道我可以通过在每个请求上放置'.fail()'来处理错误,但是有没有比这更好的方法来处理错误呢?
更进一步,我可以这样处理吗?

$.when(ajaxDeferred1, ajaxDeferred2)
  .done(function(result1, result2) {})
  .fail(function(errorForRequest1, errorForRequest2) {
  // handle error
});

编辑:

我想我需要把我的问题说得更清楚。在上面的例子中:

$.when(ajaxDeferred1, ajaxDeferred2)
  .done(function(result1, result2) {})
  .fail(function(errorForRequest1, errorForRequest2) {
  // if all request has done, but one or more request has got error, return the error here then! 
  // So I can handle which part UI should show and which UI part I should hide due to the error!
});

我希望在所有操作都完成且没有错误时得到“done”结果,在所有操作都完成**但一个或多个请求遇到问题时得到“error”结果,并将它们一起返回到“.fail(error)”中。

hiz5n14c

hiz5n14c1#

您可以使用.always(),并在其中检查每个promise并检查它是否已解决或失败。

var promises = [ajaxDeferred1, ajaxDeferred2]

$.when.apply($, promises)
  .always(function() {
    $.each(promises, function(i) {
      this.done(function(result) {
        console.log('promise', i, 'resolved');
      }).fail(function(error) {
        console.log('promise', i, 'failed');
      });
    });
  });

JSFiddle demo:https://jsfiddle.net/pr45eov1/3/

bq8i3lrv

bq8i3lrv2#

我喜欢@Miguel Mota的回答。但作为替代方案,如果延迟对象失败,您将取回延迟对象。你可以在上面添加一些数据:

var dfd1 = jQuery.ajax({
    method: 'GET',
    url: 'some request that fails first',
    timeout: 1
});

dfd1.id = 1;

var dfd2 = jQuery.ajax({
    method: 'GET',
    url: 'some request that fails second',
    timeout: 1000
});

dfd2.id = 2;

jQuery.when(dfd1, dfd2)
    .done(function () { })
    .fail(function (request) {
        // id: 1
        console.log('id: ' + request.id);
    });
ibrsph3r

ibrsph3r3#

当有多个请求时使用$.完成错误处理

var request1 = $.ajax({
    url: '...',
    type: 'GET',
    data: {
        // data
    }
});

var request2 = $.ajax({
    url: '...',
    type: 'GET',
    data: {
        // data
    }
});

$.when(request1, request2)
.done(
    function(response1, response2) {

        // success response from both

        var jsonMvtoData = response1[0];
        var resp1statusCode = response1[2].status;

        var jsonTipoOperacion = response2[0];
        var resp2statusCode = response2[2].status;

})
.fail(function(){

    // One or both requests failed

    [request1, request2].forEach(function(req) {
        req.fail(function(jqXHR) {

           // if both request fails, this will execute twice
           // you can do what u want with the json responses
           // for example store all of them in an array
                
            if (jqXHR.responseText) {
                try {
                    // Parsed JSON from failed request
                    var parsedJSON = JSON.parse(jqXHR.responseText);
                  console.error("JSON from failed request:", jqXHR.responseJSON);
                } catch (e) {
                    console.error("Failed to parse JSON:", e);
                }
            }

        });
    });
});

相关问题