6

假设我有一个运行时间较长的 jQuery Ajax 调用(比如 5 秒),如下所示:

$.ajax({
    url: '/LongCall',
    type: 'POST',
    async: true,
    cache: false,
    datatype: 'json',
    success: function(data) {
      alert('Success!');
    },
    error(xhr, textStatus, errorThrown) {
      alert('Error!');
    }
});

现在假设在等待我的五秒钟进程运行时,用户变得不耐烦并决定在我的页面上点击某种导航。上述调用中发生的情况是用户在单击链接时收到错误警报。

如果确实存在错误,我确实希望显示错误警报,但如果发生的一切是用户决定离开,我不希望显示错误警报。我怎样才能做到这一点?

换句话说,是否有一些值我可以检查(可能是 xhr.status?),它会告诉我发生的错误只是进程被中断,所以我可以知道忽略错误?

谢谢!

4

2 回答 2

8

据我所知,最好的方法是在错误处理程序中检查 xhr.readyState。任何小于 4 的值都表示进程仍在运行,因此这意味着浏览器中正在发生一些事情来中断它。

您还想调用 xhr.abort() 来尝试停止 ajax 进程,这样用户就不必在导航实际发生之前等待它完成,尽管对我来说对 xhr.abort() 的调用实际上并没有加快速度。

$.ajax({
    url: '/LongCall',
    type: 'POST',
    async: true,
    cache: false,
    datatype: 'json',
    success: function(data) {
      alert('Success!');
    },
    error(xhr, textStatus, errorThrown) {
       if (xhr.readyState < 4) {
           xhr.abort();
       }
       else {
           alert('Error!');
       }
    }
});
于 2013-03-05T00:52:59.403 回答
3

阅读文档,我会猜测您的错误处理程序应该是这样的:

error(xhr, textStatus, errorThrown) {
    if( textStatus != "abort") {
        alert("Error!");
    }
}
于 2013-03-04T23:04:22.580 回答