Jquery 模棱两可的 ajax 错误

Jquery ambiguous ajax error

提问人: 提问时间:5/15/2009 最后编辑:Jonathan Leffler 更新时间:8/8/2011 访问量:1474

问:

这是我的 ajax 调用的直觉。

function ajax(path, requestData, successCallBack, errorCallBack) {
    return $.ajax({
        error: function(xhr, textStatus, errorThrown) 
            ç(xhr, textStatus, errorThrown);
        },
        success: function(json){ 
            successCallBack(json);
        }
    });
}

当进行ajax调用并且用户单击页面上的链接时,将调用我的errorCallBack。用户离开将导致 ajax 调用被终止。 当服务器上出现错误时,也会调用我的 errorCallBack 回调。

有没有办法区分两者?

谢谢!

Ajax jQuery

评论


答:

-1赞 nickf 5/15/2009 #1

检查 xhr 对象的属性。它应该在某处有 HTTP 响应代码。

1赞 gnarf 5/15/2009 #2

我在做一些事情时遇到了同样的问题......一个“已取消”的 $.ajax 请求(用户导航离开/点击停止)xhr.status == 0 而不是 200/404/etc...

评论

2赞 Adam A 8/8/2011
但是,这不会区分用户导航离开和完全无法访问的服务器。我不认为它有效。
1赞 curthipster 8/13/2009 #3

这是我用来实现 gnarf 和 nickf 答案的技术:

当用户通过刷新、单击链接或更改浏览器中的 URL 离开页面时,jQuery 将引发错误事件。可以通过实现 ajax 调用的错误处理程序并检查 xmlHttpRequest 对象来检测这些类型的错误:

$.ajax({
    /* ajax options omitted */
    error: function (xmlHttpRequest, textStatus, errorThrown) {
         if(xmlHttpRequest.readyState == 0 || xmlHttpRequest.status == 0) 
              return;  // it's not really an error
         else
              // Do normal error handling
});
3赞 Adam A 8/8/2011 #4

@colbeerhey的答案很好,但你可以更进一步。您仍然需要知道服务器是否真的无法访问。我在这里问了这个问题,但完整的答案是:

var running = true;
$(window).bind('beforeunload', function() { running = false; });

$.ajax({
    /* ajax options omitted */
    error: function (xmlHttpRequest, textStatus, errorThrown) {
         var serverNotReached = xmlHttpRequest.readyState == 0 || xmlHttpRequest.status == 0;
         if(serverNotReached && !running) 
              return;  // it's not really an error, user clicked away
         else if (serverNotReached)
              // The server is down!  You didn't get any response at all.
         else
              // Do normal error handling
});

请记住,onbeforeunload 只是一个事实上的标准(IE FF、Webkit 都处理它),所以如果你关心更晦涩的浏览器,这将会中断。