jQuery $ .ajax错误处理

jQuery $.ajax error handling

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
jQuery ajax error function

我试图用我可以从每个ajax调用调用的函数替换"全局"ajax错误处理程序,因为我们的实现中观察到了问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
$(document).ajaxError(function(e, jqXHR, settings, exception) {
    // using BrowserDetect function to get browser info
    var browser    = BrowserDetect.browser;
    var browserVer = BrowserDetect.version;
    var browserOS  = BrowserDetect.OS;
    var ajax_url   = settings.url;
    $.ajax({async: true,
            type:     'POST',
            url:      AJAX_ERROR_LOG_URL,
            dataType: 'json',
            data:     'host='myhost.com&status='+jqXHR.status+'&error='+jqXHR.responseText+'&expmessage='+exception.message+'&url='
                       +ajax_url+'&browser='+browser+'&browserVer='+browserVer+'&browserOS='+browserOS
    });
    if (jqXHR.status === 0) {
        final_message(ERROR_MSG + '0'); // Not connected. Please verify network is connected.
    } else if (jqXHR.status == 404) {
        final_message(ERROR_MSG + '404'); // Requested page not found. [404]
    } else if (jqXHR.status == 500) {
        final_message(ERROR_MSG + '500'); // Internal Server Error [500].
    } else if (exception === 'parsererror') {
        final_message(ERROR_MSG + '1'); // Requested JSON parse failed.
    } else if (exception === 'timeout') {
        final_message(ERROR_MSG + '2'); // Time out error.
    } else if (exception === 'abort') {
        final_message(ERROR_MSG + '3'); // Ajax request aborted.
    } else {
      if(browserVer == '7' && browser == 'Explorer') {
        final_message(ERROR_MSG + '100'); // Uncaught Error
      } else {
        final_message(ERROR_MSG + '99'); // Uncaught Error
      }
    }
});

我想将其转换为函数并将其称为:

1
2
3
4
5
6
7
8
9
10
11
12
$.ajax({async: true,
        type:'POST',
        url: url,
        dataType: 'json',
        data:    "username="+username+"&password="+pass,
        success:  ajaxLoginResult
        error:    logAjaxError(jqXHR, textStatus, errorThrown)
});

function logAjaxError(jqXHR, textStatus, errorThrown) {
  // more code here to log the error
}

问题在于我无法将ajax的url调用到错误回调,因为传递的唯一内容是jqXHR,textStatus,errorThrown。 在.ajaxError设置中,设置被传递,这是我们从中获取URL的位置。
有任何想法吗?

编辑2/3:
以下是Add_Course函数供您查看:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function Add_Course(reason) {
  var eventid = $('#eventid'+$('#obleventcode').attr('value')).val();
  var url = AJAX_URL_ADDTOCART + '?sku='+eventid+'&mainitem=true&pid='+pid;
  if(reason != 'VOUCHER'){
    log_url(url);
    $.ajax({async: true,
            type:'POST',
            url: url,
            dataType: 'json',
            success: function(data){
              if(data.result=='success') {
                var cemsg_index=reason.indexOf('CEMSG');
                if(cemsg_index>=0) {
                  final_ce_message(reason.substr(cemsg_index+6));
                } // if(cemsg_index>=0)
              } else {
                $('#sm_content .oblcontent').html(data.message);
              } // if(data.result=='success')
            },
            complete: function(jqXHR, textStatus) {
              log_url('redirecting to cart');
              window.location = CART_URL;
            } // complete
    });
  }
}


首先,祝贺实际检查错误。 因此,许多人编写的代码永远不会让互联网出现问题。 哈。

而不是编辑每次调用$.ajax,你可以调用$.ajaxSetup()让每个调用使用你的函数作为错误处理程序。 错误处理程序签名是error(jqXHR, textStatus, errorThrown),它可以方便地匹配您的函数,因此在执行任何$.ajax调用之前,请尝试调用$.ajaxSetup({ error: logAjaxError })


您应该能够在错误回调中访问this.url

1
error:    logAjaxError(jqXHR, textStatus, errorThrown, this.url)