jquery - 使用 jQuery 中止 JSONP ajax 请求

标签 jquery ajax callback jsonp abort

我正在使用 JSONP ajax 调用从不同的域加载一些内容,如果用户在按钮上引起“鼠标悬停”,所有这些内容都会被执行。

我可以捕获 $.ajax() 调用返回作为 xhr 对象,并在每次用户引起“鼠标悬停”时使用它来中止 ajax 请求。但是 JSONP 回调函数仍然被调用,这会导致错误,我认为这是因为 xhr.abort() 方法不会阻止回调函数被调用。

我尝试使用 try{}catch(e){} 包围 $.ajax() 调用,但在调用 xhr.abort() 方法后,错误仍然存​​在。

有没有办法处理这个异常?

引发的异常是这样的(根据Firebug): jQuery16102234208755205157_1308941669256 不是一个函数

异常的内部结构是这样的: jQuery16102234208755205157_1308941669256({...我来自不同域的json数据...})

最佳答案

基本答案就是给出的 here :您无法真正abort() JSONP 调用。所以真正的问题是,如何避免多余的回调调用和您看到的错误?

您不能在回调周围使用 try...catch 因为它是异步的;你必须从 jQuery 的末端捕获它,并且 jQuery 通常不处理回调抛出的异常。 (我在我的书 Async JavaScript 中对此进行了讨论。)您想要做的是为每个 Ajax 调用使用唯一的标识符,并且在调用成功回调时,检查该标识符是否与您调用时的标识符相同的电话。这是一个简单的实现:

var requestCount = 0;
$.ajax(url, {
  dataType: 'jsonp',
  requestCount: ++requestCount,
  success: function(response, code) {
    if (requestCount !== this.requestCount) return;
    // if we're still here, this is the latest request...
  }
});

在这里,我利用了这样一个事实:传递给 $.ajax 的任何内容都会附加到在回调中用作 this 的对象。

当然,如果 jQuery 让 abort() 为我们做这件事,那就太好了。

关于jquery - 使用 jQuery 中止 JSONP ajax 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6472509/

相关文章:

javascript - 向下滚动后粘性标题

javascript - 如何通过最接近的匹配文本获取元素?

javascript - 简单 Ajax 加载页面的计时器

javascript - 为什么ajax不将我重定向到另一个html页面?

jQuery .fadeOut 回调到 .click 不起作用

javascript - 单击时,该类已添加,但单击另一个时,添加的相同类不会被删除

javascript - 单击按钮分别显示字符串数组的元素

javascript - 如何使用ckeditore使用ajax发送数据?

Android广播接收器,每次应用启动时接收广播

javascript for循环和超时函数