[jquery] jQuery에서 모든 활성 아약스 요청 중지

양식을 제출할 때 모든 활성 아약스 요청이 실패하고 문제가 발생하는 문제가 있습니다.

Trigerring 오류 이벤트없이 jQuery에서 모든 활성 Ajax 요청을 중지하는 방법은 무엇입니까?



답변

ajax 요청을 작성할 때마다 변수를 사용하여 저장할 수 있습니다.

var request = $.ajax({
    type: 'POST',
    url: 'someurl',
    success: function(result){}
});

그런 다음 요청을 중단 할 수 있습니다.

request.abort();

배열을 사용하여 보류중인 모든 아약스 요청을 추적하고 필요한 경우 중단 할 수 있습니다.


답변

다음 스 니펫을 사용하면 요청 목록 ( ) 을 유지 관리하고 필요한 경우 모두 중단 할 수 있습니다. 다른 AJAX 호출을 하기 전에<HEAD> html 에 배치하는 것이 가장 좋습니다.

<script type="text/javascript">
    $(function() {
        $.xhrPool = [];
        $.xhrPool.abortAll = function() {
            $(this).each(function(i, jqXHR) {   //  cycle through list of recorded connection
                jqXHR.abort();  //  aborts connection
                $.xhrPool.splice(i, 1); //  removes from list by index
            });
        }
        $.ajaxSetup({
            beforeSend: function(jqXHR) { $.xhrPool.push(jqXHR); }, //  annd connection to list
            complete: function(jqXHR) {
                var i = $.xhrPool.indexOf(jqXHR);   //  get index for current connection completed
                if (i > -1) $.xhrPool.splice(i, 1); //  removes from list by index
            }
        });
    })
</script>


답변

문서 페이지에 표시된대로 ajaxSetup 사용이 올바르지 않습니다 . 기본값 만 설정하고 일부 요청이 재정의하면 엉망이됩니다.

나는 파티에 늦었지만 나중에 누군가가 같은 문제에 대한 해결책을 찾고 있다면 나중에 참조 할 것입니다. 이전 답변에서 영감을 얻었으며 이전 답변과 거의 동일하지만 더 완벽합니다.

// Automatically cancel unfinished ajax requests 
// when the user navigates elsewhere.
(function($) {
  var xhrPool = [];
  $(document).ajaxSend(function(e, jqXHR, options){
    xhrPool.push(jqXHR);
  });
  $(document).ajaxComplete(function(e, jqXHR, options) {
    xhrPool = $.grep(xhrPool, function(x){return x!=jqXHR});
  });
  var abort = function() {
    $.each(xhrPool, function(idx, jqXHR) {
      jqXHR.abort();
    });
  };

  var oldbeforeunload = window.onbeforeunload;
  window.onbeforeunload = function() {
    var r = oldbeforeunload ? oldbeforeunload() : undefined;
    if (r == undefined) {
      // only cancel requests if there is no prompt to stay on the page
      // if there is a prompt, it will likely give the requests enough time to finish
      abort();
    }
    return r;
  }
})(jQuery);


답변

다음은 현재이를 달성하기 위해 사용하고있는 것입니다.

$.xhrPool = [];
$.xhrPool.abortAll = function() {
  _.each(this, function(jqXHR) {
    jqXHR.abort();
  });
};
$.ajaxSetup({
  beforeSend: function(jqXHR) {
    $.xhrPool.push(jqXHR);
  }
});

참고 : _.each of underscore.js가 있지만 반드시 필요한 것은 아닙니다. 나는 단지 게으르고 $ .each ()로 바꾸고 싶지 않습니다. 8P


답변

각 xhr 요청에 고유 ID를 부여하고 전송하기 전에 오브젝트에 오브젝트 참조를 저장하십시오. xhr 요청이 완료된 후 참조를 삭제하십시오.

언제든지 모든 요청을 취소하려면

$.ajaxQ.abortAll();

취소 된 요청의 고유 ID를 반환합니다. 테스트 목적으로 만 사용하십시오.

작업 기능 :

$.ajaxQ = (function(){
  var id = 0, Q = {};

  $(document).ajaxSend(function(e, jqx){
    jqx._id = ++id;
    Q[jqx._id] = jqx;
  });
  $(document).ajaxComplete(function(e, jqx){
    delete Q[jqx._id];
  });

  return {
    abortAll: function(){
      var r = [];
      $.each(Q, function(i, jqx){
        r.push(jqx._id);
        jqx.abort();
      });
      return r;
    }
  };

})();

필요할 때 더 많은 기능을 추가하는 데 사용할 수있는 단일 함수를 가진 객체를 반환합니다.


답변

여러 요청에 너무 쉽다는 것을 알았습니다.

1 단계 : 페이지 상단에 변수를 정의하십시오.

  xhrPool = []; // no need to use **var**

2 단계 : 모든 ajax 요청에서 beforeSend를 설정하십시오.

  $.ajax({
   ...
   beforeSend: function (jqXHR, settings) {
        xhrPool.push(jqXHR);
    },
    ...

3 단계 : 필요한 곳에서 사용하십시오 :

   $.each(xhrPool, function(idx, jqXHR) {
          jqXHR.abort();
    });


답변

xhrPool.abortAll 이 주어진 URL의 보류중인 모든 요청 중단 할 수 있도록 mkmurray 및 SpYk3HH 답변을 위에서 확장했습니다 .

$.xhrPool = [];
$.xhrPool.abortAll = function(url) {
    $(this).each(function(i, jqXHR) { //  cycle through list of recorded connection
        console.log('xhrPool.abortAll ' + jqXHR.requestURL);
        if (!url || url === jqXHR.requestURL) {
            jqXHR.abort(); //  aborts connection
            $.xhrPool.splice(i, 1); //  removes from list by index
        }
    });
};
$.ajaxSetup({
    beforeSend: function(jqXHR) {
        $.xhrPool.push(jqXHR); //  add connection to list
    },
    complete: function(jqXHR) {
        var i = $.xhrPool.indexOf(jqXHR); //  get index for current connection completed
        if (i > -1) $.xhrPool.splice(i, 1); //  removes from list by index
    }
});
$.ajaxPrefilter(function(options, originalOptions, jqXHR) {
    console.log('ajaxPrefilter ' + options.url);
    jqXHR.requestURL = options.url;
});

abortAll이 URL을 매개 변수로 선택적으로 승인 할 수 있고 해당 URL에 대한 보류중인 호출 만 취소한다는 점을 제외하면 사용법은 동일합니다.