jQuery.ajax 처리는 다음과 같은 응답을 계속합니다 :“성공 :”대“.done”?


309

지금은 몇 주 동안 jQuery를하고 AJAX와 협력하고 나는 호출이 된 후 스크립트를 '계속'을 두 가지 방법을 보았다 : success:.done.

jQuery 문서 의 개요에서 우리는 다음을 얻습니다.

.done () : 설명 : Deferred 객체가 해결 될 때 호출 될 핸들러를 추가합니다.

성공 : (.ajax () 옵션) : 요청이 성공하면 호출 할 함수입니다.

따라서 둘 다 AJAX 호출이 완료 / 해결 된 후에 무언가를합니다. 하나 또는 다른 것을 무작위로 사용할 수 있습니까? 차이점은 무엇이며 언제 하나 대신 사용됩니까?

답변:


469

successjQuery에서 성공 콜백의 전통적인 이름으로, ajax 호출에서 옵션으로 정의되었습니다. 그러나 $.Deferreds보다 복잡한 콜백의 done구현은 성공 콜백을 구현하기 위해 선호되는 방법이므로 any에서 호출 할 수 있습니다 deferred.

예를 들어, 성공 :

$.ajax({
  url: '/',
  success: function(data) {}
});

예를 들면 다음과 같습니다.

$.ajax({url: '/'}).done(function(data) {});

좋은 점은 done의 반환 값 $.ajax이 이제 응용 프로그램의 다른 곳에 바인딩 될 수있는 지연된 약속이라는 것입니다. 따라서 몇 가지 다른 장소 에서이 아약스 호출을하고 싶다고 가정 해 봅시다. 오히려이 아약스 호출을 함수에 옵션으로 성공 함수에 전달하는 대신, 당신은 단지 함수 반환 할 수 있습니다 $.ajax자체와 결합하여 콜백 done, fail, then, 또는 무엇이든을. 참고 always요청이 성공 또는 실패 여부를 실행하는 콜백입니다. done성공시에만 트리거됩니다.

예를 들면 다음과 같습니다.

function xhr_get(url) {

  return $.ajax({
    url: url,
    type: 'get',
    dataType: 'json',
    beforeSend: showLoadingImgFn
  })
  .always(function() {
    // remove loading image maybe
  })
  .fail(function() {
    // handle request failures
  });

}

xhr_get('/index').done(function(data) {
  // do stuff with index data
});

xhr_get('/id').done(function(data) {
  // do stuff with id data
});

유지 관리 측면에서이 기능의 중요한 이점은 애플리케이션 별 기능으로 아약스 메커니즘을 래핑했다는 것입니다. $.ajax나중에 다르게 작동 하기 위해 전화가 필요하다고 결정 하거나 다른 ajax 메소드를 사용하거나 jQuery에서 멀어지면 xhr_get정의 를 변경하기 만하면됩니다 (약속 또는 최소한 done메소드 를 반환해야합니다 . 위 예의 경우). 앱 전체의 다른 모든 참조는 동일하게 유지 될 수 있습니다.

당신이 할 수있는 더 많은 (훨씬 멋진) 일이 있습니다 $.Deferred. 그중 하나 pipe$.ajax요청 자체가 성공 하더라도 서버 가보고 한 오류에서 실패를 트리거하는 데 사용 됩니다 . 예를 들면 다음과 같습니다.

function xhr_get(url) {

  return $.ajax({
    url: url,
    type: 'get',
    dataType: 'json'
  })
  .pipe(function(data) {
    return data.responseCode != 200 ?
      $.Deferred().reject( data ) :
      data;
  })
  .fail(function(data) {
    if ( data.responseCode )
      console.log( data.responseCode );
  });
}

xhr_get('/index').done(function(data) {
  // will not run if json returned from ajax has responseCode other than 200
});

http://api.jquery.com/category/deferred-object/ 에 대해 자세히 알아 $.Deferred보십시오.

참고 : jQuery 1.8부터는 정확히 동일한 방식 pipe으로 사용하기 위해 더 이상 사용되지 않습니다 then.


2
나는 success:/ 의 상호 작용이 어떻게 .done()정의 되는지 궁금합니다 . 예를 들어 요즘 success:처음으로 구현 .done()되었습니까?

6
당신이 모두있는 경우는 의미 success:.done아약스 호출을? 좋은 질문. 다른 모든 콜백은 바인딩 된 순서대로 호출되므로 제 추측은 그렇습니다 success. 먼저 먼저 호출됩니다.
glortho

1
아주 좋은 포스트! 파이프 콜백에서 Btw는 상태 응답을 확인하기 위해 jqXHR 매개 변수를 사용하여 파이프 함수를 호출하지 않아야합니까? 예 : .pipe (function (data, textStatus, jqXHR) {if (jqXHR.status == 200) {...
Eder

@Eder이 사용으로 해결하려는 시나리오 pipe는 요청 자체는 성공하지만 서버의 스크립트가 원하는 것을 반환하지 않는 시나리오입니다. http 응답과 응용 프로그램 응답을 의미있게 구분하기 위해 실제 404 또는 500 또는 서버 측에 아무것도 던지지 않을 수 있습니다. JSON에서 응답 코드를 설정 한 다음 pipe이 방법을 사용하면 더 많은 뉘앙스로 다양한 종류의 오류를 처리 할 수 ​​있습니다.
glortho

약속 사용의 또 다른 중요한 이점은 코드를 훨씬 더 읽기 쉽고 '콜백 지옥'을 피한다는 것입니다. 이는 이전에 완료 한 후에 각각을 실행하려는 여러 개의 콜백이있는 경우에 특히 그렇습니다. 약속하면 성공 옵션과 함께 사용되는 중첩 된 복잡한 콜백 구조 대신 myPromiseCall.then (..). then (..)처럼 보일 것입니다.
BornToCode

5

async: false아약스에 필요한 경우 success대신을 사용해야 합니다 .done. 그렇지 않으면 사용하는 것이 좋습니다 .done. 이것은 jQuery 공식 사이트에서 온 것입니다 .

jQuery를 1.8으로 의 사용 비동기 : 거짓 jqXHR ($ .Deferred)와 함께 사용되지 않습니다; 당신은 해야한다 사용 성공 / 오류 / 전체 콜백 옵션을 대신 같은 jqXHR 객체의 대응 방법 () jqXHR.done .


누가 언급 async:false했습니까?
Liam

$.ajax({ url: req_url, ..., async: false, success: function (result, status, req) { }, error: function (jqXHR, status) { } });
AmirHossein Manian

0

에서 JQuery와 문서

$.ajax()jQuery 1.5부터 반환 된 jqXHR 객체 는 Promise 인터페이스를 구현하여 Promise의 모든 속성, 메서드 및 동작을 제공합니다 ( 자세한 내용 은 지연된 객체 참조 ). 이러한 메소드는 $.ajax()요청이 종료 될 때 호출되는 하나 이상의 함수 인수를 사용 합니다. 이를 통해 단일 요청에서 여러 개의 콜백을 할당 할 수 있으며 요청이 완료된 후 콜백을 할당 할 수도 있습니다. 요청이 이미 완료된 경우 콜백이 즉시 시작됩니다. jqXHR 객체의 사용 가능한 Promise 메소드는 다음과 같습니다.

jqXHR.done(function( data, textStatus, jqXHR ) {});

성공 콜백 옵션의 대체 구성 deferred.done()은 구현 세부 사항을 참조 하십시오.

jqXHR.fail(function( jqXHR, textStatus, errorThrown ) {});

오류 콜백 옵션의 대체 구문 인이 .fail()메소드는 더 이상 사용되지 않는 .error () 메소드를 대체합니다. 구현 세부 사항은 deferred.fail ()을 참조하십시오.

jqXHR.always(function( data|jqXHR, textStatus, jqXHR|errorThrown ) { }); 

(jQuery 1.6에 추가됨) 전체 콜백 옵션의 대체 구문 인이 .always()메소드는 더 이상 사용되지 않는 .complete()메소드를 대체합니다 .

성공적인 요청에 대한 응답으로 함수의 인수는 .done()data, textStatus 및 jqXHR 객체 의 인수와 동일 합니다. 실패한 요청의 경우 인수는 .fail()jqXHR 오브젝트, textStatus 및 errorThrown 의 인수와 동일 합니다. 자세한 deferred.always()구현 내용을 참조 하십시오.

jqXHR.then(function( data, textStatus, jqXHR ) {}, function( jqXHR, textStatus, errorThrown ) {});

(jQuery 1.8 기준) 기본 Promise를 조작 할 수 있도록 .done().fail()메소드 의 기능을 통합합니다 . .then()구현 세부 사항 은 지연 을 참조 하십시오.

중단 공지 사항 :jqXHR.success() , jqXHR.error()jqXHR.complete()콜백은 jQuery를 3.0으로 제거됩니다. 당신은 사용할 수 있습니다 jqXHR.done(), jqXHR.fail()그리고 jqXHR.always()대신.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.