-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();

すべてが機能しています。

jqxhr オブジェクトで abort() が機能しないのはなぜですか?

編集:JQuery 1.8.3の使用

編集: 例を作成しました: http://jsfiddle.net/9HmQd/ then() ブロックを追加すると、中止が未定義であることがわかりました。

4

4 に答える 4

2

あなたの問題は、メソッドからの戻り値を使用していないことです$.ajax()-メソッドからの戻り値を使用していますthen()-これは約束です。

$.ajax()にすぐにチェーンすることthen()で、最終的にメソッドを持たない promise オブジェクトを返しますabort()

于 2013-10-02T00:49:38.087 に答える
2

を使用すると、 jqXHRオブジェクトで.ajax()ある特別な種類のプロミスが返されますが、 jqxhrで呼び出すと、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 呼び出しから戻ったときに作成されたものです - さまざまなコンポーネントに見られるように ( complete: function(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 に答える