복붙노트

[JQUERY] 어떻게 jQuery를 AJAX 요청 중지 / 취소하려면?

JQUERY

어떻게 jQuery를 AJAX 요청 중지 / 취소하려면?

해결법


  1. 1.JQuery와 아약스 방법은 XMLHttpRequest의 개체를 반환합니다. 당신은 요청을 취소하기 위해이 객체를 사용할 수 있습니다.

    JQuery와 아약스 방법은 XMLHttpRequest의 개체를 반환합니다. 당신은 요청을 취소하기 위해이 객체를 사용할 수 있습니다.

    XMLHttpRequest의 요청을 취소 중단이 방법을 가지고 있지만, 요청이 서버에 이미 전송 된 경우 다음 서버는 우리가 요청을 중단하지만, 클라이언트 / 대기 응답을 처리하지 않더라도 요청을 처리합니다.

    XHR 객체는 상기 요청의 상태를 포함하는 readyState의 포함 (UNSENT-0, HEADERS_RECEIVED -2- 로딩 -3- 1 개방 DONE-4). 우리는 이전 요청이 완료되었는지 확인하려면이 사용할 수 있습니다.

    $(document).ready(
        var xhr;
    
        var fn = function(){
            if(xhr && xhr.readyState != 4){
                xhr.abort();
            }
            xhr = $.ajax({
                url: 'ajax/progress.ftl',
                success: function(data) {
                    //do something
                }
            });
        };
    
        var interval = setInterval(fn, 500);
    );
    

  2. 2.당신이 서버에 요청을 할 때, 진행이 null (또는 데이터를 가져 오는) 첫째하지 있는지 확인해야합니다. 그것은 이전 요청 중단, 데이터를 가져 오는 새로운 일을 시작하는 경우.

    당신이 서버에 요청을 할 때, 진행이 null (또는 데이터를 가져 오는) 첫째하지 있는지 확인해야합니다. 그것은 이전 요청 중단, 데이터를 가져 오는 새로운 일을 시작하는 경우.

    var progress = null
    
    function fn () {    
        if (progress) {
            progress.abort();
        }
        progress = $.ajax('ajax/progress.ftl', {
            success: function(data) {
                //do something
                progress = null;
            }
        });
    }
    

  3. 3.나는이 조금 늦게 수 있습니다 알고하지만 난 중단 방법 didnt 한이 정말로 요청을 중단 부르심 유사한 문제가 발생합니다. 대신 브라우저는 여전히 사용 결코 응답을 기다리고 있었다. 이 코드는 문제를 해결.

    나는이 조금 늦게 수 있습니다 알고하지만 난 중단 방법 didnt 한이 정말로 요청을 중단 부르심 유사한 문제가 발생합니다. 대신 브라우저는 여전히 사용 결코 응답을 기다리고 있었다. 이 코드는 문제를 해결.

     try {
            xhr.onreadystatechange = null;
            xhr.abort();
    } catch (e) {}
    

  4. 4.왜 요청을 중단해야합니까?

    왜 요청을 중단해야합니까?

    각 요청 5 초 이상 걸리는 경우, 어떤 일이 일어날 것인가?

    당신은 요청 중단 요청과 함께 전달하는 매개 변수가 변경되지는 안합니다. 예를 들면 : - 요청 알림 데이터를 검색합니다. 이러한 상황에서, 좋은 접근 방법은 새로운 요청 만 이전 Ajax 요청을 완료 한 후 그 집합입니다.

    $(document).ready(
    
        var fn = function(){
    
            $.ajax({
                url: 'ajax/progress.ftl',
                success: function(data) {
                    //do something
                },
    
                complete: function(){setTimeout(fn, 500);}
            });
        };
    
         var interval = setTimeout(fn, 500);
    
    );
    

  5. 5.당신은 JQuery와 - validate.js를 사용할 수 있습니다. 다음은 JQuery와 - validate.js에서 코드입니다.

    당신은 JQuery와 - validate.js를 사용할 수 있습니다. 다음은 JQuery와 - validate.js에서 코드입니다.

    // ajax mode: abort
    // usage: $.ajax({ mode: "abort"[, port: "uniqueport"]});
    // if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()
    
    var pendingRequests = {},
        ajax;
    // Use a prefilter if available (1.5+)
    if ( $.ajaxPrefilter ) {
        $.ajaxPrefilter(function( settings, _, xhr ) {
            var port = settings.port;
            if ( settings.mode === "abort" ) {
                if ( pendingRequests[port] ) {
                    pendingRequests[port].abort();
                }
                pendingRequests[port] = xhr;
            }
        });
    } else {
        // Proxy ajax
        ajax = $.ajax;
        $.ajax = function( settings ) {
            var mode = ( "mode" in settings ? settings : $.ajaxSettings ).mode,
                port = ( "port" in settings ? settings : $.ajaxSettings ).port;
            if ( mode === "abort" ) {
                if ( pendingRequests[port] ) {
                    pendingRequests[port].abort();
                }
                pendingRequests[port] = ajax.apply(this, arguments);
                return pendingRequests[port];
            }
            return ajax.apply(this, arguments);
        };
    }
    

    그래서 그냥 단지 당신이 아약스 요청을 할 때 중단 매개 변수 모드를 설정할 필요가있다.

    참고 : HTTPS : //cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.14.0/jquery.validate.js


  6. 6.jQuery를 : 영감 - 시작 지점으로 사용합니다. 나는 이런 식으로 해결 : (이것은 단지 마지막 인스턴스를 중단, 완벽한 해결책이 아니다 및 WIP 코드)

    jQuery를 : 영감 - 시작 지점으로 사용합니다. 나는 이런 식으로 해결 : (이것은 단지 마지막 인스턴스를 중단, 완벽한 해결책이 아니다 및 WIP 코드)

    var singleAjax = function singleAjax_constructor(url, params) {
        // remember last jQuery's get request
        if (this.lastInstance) {
            this.lastInstance.abort();  // triggers .always() and .fail()
            this.lastInstance = false;
        }
    
        // how to use Deferred : http://api.jquery.com/category/deferred-object/
        var $def = new $.Deferred();
    
        // pass the deferrer's request handlers into the get response handlers
        this.lastInstance = $.get(url, params)
            .fail($def.reject)         // triggers .always() and .fail()
            .success($def.resolve);    // triggers .always() and .done()
    
        // return the deferrer's "control object", the promise object
        return $def.promise();
    }
    
    
    // initiate first call
    singleAjax('/ajax.php', {a: 1, b: 2})
        .always(function(a,b,c) {console && console.log(a,b,c);});
    
    // second call kills first one
    singleAjax('/ajax.php', {a: 1, b: 2})
        .always(function(a,b,c) {console && console.log(a,b,c);});
        // here you might use .always() .fail() .success() etc.
    

  7. 7.당신의 API를 호출하는 기능을 만듭니다. 이 함수 내에서 우리는 요청 callApiRequest = $ 갔지를 (정의 ... -.이 변수의 정의는, 요청이 즉시이라고하지만 지금 우리가 변수로 정의 된 요청이 요청이 호출되기 전에 비록 우리 ! 우리 변수 대해서 typeof (callApiRequest) 정의되어있는 경우 = '정의되지 않은'하고 suggestCategoryRequest.state을 () ==중인 경우도 '보류'확인 - 모두) (우리 .abort, 해당하는 경우 성공 콜백을 방지 할 수 요청 실행에서.

    당신의 API를 호출하는 기능을 만듭니다. 이 함수 내에서 우리는 요청 callApiRequest = $ 갔지를 (정의 ... -.이 변수의 정의는, 요청이 즉시이라고하지만 지금 우리가 변수로 정의 된 요청이 요청이 호출되기 전에 비록 우리 ! 우리 변수 대해서 typeof (callApiRequest) 정의되어있는 경우 = '정의되지 않은'하고 suggestCategoryRequest.state을 () ==중인 경우도 '보류'확인 - 모두) (우리 .abort, 해당하는 경우 성공 콜백을 방지 할 수 요청 실행에서.

    // We need to wrap the call in a function
    callApi = function () {
    
        //check if request is defined, and status pending
        if (typeof(callApiRequest) != 'undefined'
            && suggestCategoryRequest.state() == 'pending') {
    
            //abort request
            callApiRequest.abort()
    
        }
    
        //define and make request
        callApiRequest = $.get("https://example.com", function (data) {
    
            data = JSON.parse(data); //optional (for JSON data format)
            //success callback
    
        });
    }
    

    서버 / API는 (? API는 이미 몇 가지 코드를 실행하면 무엇을) 요청을 중단 지원하지 않을 수 있습니다,하지만 자바 스크립트 콜백이 발생하지 않습니다. 예를 들어 당신은 같은 해시 태그를 입력으로 사용자 입력 제안을 제공하는 경우에 유용합니다.

    당신은 추가 오류 콜백의 정의를 추가하여이 기능을 확장 할 수 있습니다 - 요청이 중단 된 경우 어떻게해야하는지.

    이 코드에 대한 일반적인 사용 사례는 텍스트 입력 될 키를 누를 때 이벤트에 화재가. 당신은 당신이) (.abort 취소 할 것을 요청 (의 일부)를 전송 방지하기 위해 제한 시간을 사용할 수 있습니다.


  8. 8.또한 readyState가 0 확인해야하기 때문에이 객체에 0) (이 기능 세트 readyState의를 xhr.abort를 사용하여 검사가 항상 참이 될 것입니다 경우 때! - readyState가 = 4

    또한 readyState가 0 확인해야하기 때문에이 객체에 0) (이 기능 세트 readyState의를 xhr.abort를 사용하여 검사가 항상 참이 될 것입니다 경우 때! - readyState가 = 4

    $(document).ready(
        var xhr;
    
        var fn = function(){
            if(xhr && xhr.readyState != 4 && xhr.readyState != 0){
                xhr.abort();
            }
            xhr = $.ajax({
                url: 'ajax/progress.ftl',
                success: function(data) {
                    //do something
                }
            });
        };
    
        var interval = setInterval(fn, 500);
    ); 
    
  9. from https://stackoverflow.com/questions/4551175/how-to-cancel-abort-jquery-ajax-request by cc-by-sa and MIT license