-1

JQuery ajax文档说您可以通过以下方式访问 XMLHttpRequest:

var jqxhr = $.ajax({
      xhr: function() {
          var xhrNativeObject = new window.XMLHttpRequest();
          xhrNativeObject.upload.addEventListener("progress", function(event) { 
               // progress bar 
          }, false);
          return xhrNativeObject;
      },
      url: url,
  type: "POST",
  data: formdata,
  processData: false,
  contentType: false
    }).then(function(response) { 
         ...         
    });
   jqxhr.abort();  // this is not working!!!

当我在控制台中打印 jqxhr 时,这对我不起作用:

Object {url: "http://someurl", isLocal: false, global: true, type: "POST", contentType: false…} 

当我执行以下操作时,我只会得到 XMLHttpRequest:

var myXHR;
$.ajax({
   xhr: function() { 
      myXHR = new window.XMLHttpRequest(); 
   }
 ... });

当我在控制台上打印 myXHR 时,我得到:

XMLHttpRequest {open: function, setRequestHeader: function, send: function, abort: function, getAllResponseHeaders: function…}

这是对的。

JQuery 文档说我可以对 jqxhr 对象执行 abort() 。什么时候做:

jqxhr.abort();

我收到以下控制台错误:

Uncaught TypeError: Object #<Object> has no method 'abort'

当我做

myXHR.abort();

一切正常。

为什么 abort() 不适用于 jqxhr 对象?

编辑:使用 JQuery 1.8.3

编辑:我创建了一个示例: http: //jsfiddle.net/9HmQd/ 事实证明,当我添加 then() 块时,中止是未定义的。

4

4 回答 4

2

您的问题是您没有使用方法的返回值$.ajax()- 您正在使用方法的返回值then()- 这是一个承诺。

通过$.ajax()立即链接到then(),您最终将返回没有abort()方法的承诺对象。

于 2013-10-02T00:49:38.087 回答
2

当您使用.ajax()时,它返回一种特殊的承诺,即jqXHR对象,但是当您在 jqxhr 上调用 then 时,它返回一个承诺对象,该对象没有与 jqXhr 关联的方法 - 在您的情况下,这个承诺是分配给由于链接的xhr变量。

解决方案

var xhr = $.ajax({
    url: '/echo/json'
});
xhr.then(function (response) {})

console.log(xhr.abort);

演示:小提琴

于 2013-10-02T00:49:57.483 回答
0

我认为您误读了文档。您所追求的 jqXHR 是在从 ajax 调用返回时创建的 - 如在各种组件中所见(完整:函数(jqXHR,textStatus)。文档示例:

var request = $.ajax({
  url: "script.php",
  type: "POST",
  data: { id : menuId },
  dataType: "html"
});

request.done(function( msg ) {
  $( "#log" ).html( msg );
});

request.fail(function( jqXHR, textStatus ) {
  alert( "Request failed: " + textStatus );
});
于 2013-10-02T00:32:01.487 回答
0

试试这个方法。如果有一个持续的请求需要很长时间,那么您可以在该请求完成之前而不是在完成之后中止。

   var jqxhr = null;
    function getData(){
    if(jqxhr  != null)
    {
     jqxhr.abort();  // aborts only when an ongoing request is there.
    }

    jqxhr = $.ajax({
          xhr: function() {
              var xhrNativeObject = new window.XMLHttpRequest();
              xhrNativeObject.upload.addEventListener("progress", function(event) { 
                   // progress bar 
              }, false);
              return xhrNativeObject;
          },
          url: url,
      type: "POST",
      data: formdata,
      processData: false,
      contentType: false
        }).then(function(response) { 
             jqxhr = null;     
        });
    jqxhr = null; 
}
于 2013-10-02T00:47:39.890 回答