使用jQuery中止JSONP ajax请求

Dav*_*vid 16 ajax jquery jsonp callback abort

我正在使用JSONP ajax调用来加载来自不同域的一些内容,如果用户在按钮上导致"鼠标悬停",则执行所有这些操作.

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

我尝试使用try {} catch(e){}围绕$ .ajax()调用,但在调用xhr.abort()方法后,错误仍在继续.

有没有办法处理该异常?

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

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

Tre*_*ham 11

基本答案就是这里给出的答案:你不能真正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...
  }
});
Run Code Online (Sandbox Code Playgroud)

在这里,我利用了这样一个事实,即传递给它的任何东西$.ajax都附加到this回调中使用的对象上.

abort()当然,如果jQuery 为我们这样做的话会很好.


Dec*_*ook -3

在 jQuery 1.5 中,所有 Ajax API 都有一个围绕本机 XHR 对象的包装器对象。看一眼:

http://api.jquery.com/jQuery.ajax/#jqXHR

 jqxhr.abort(); // should be what you're looking for
Run Code Online (Sandbox Code Playgroud)

  • 这就是我现在正在使用的。这将中止 ajax 请求。但是这个ajax请求使用的是JSONP。在我使用“abort()”方法后,调用由 jQuery 内部生成的用于处理 JSONP 响应的 javascript 函数,但 abort 方法似乎删除了该函数定义或其他内容,因为有一个例外,我没有能够处理。 (2认同)