2012-01-13 3 views
89

아무도 도와 줄 수 있습니까?
success.done()의 차이를 $.ajax으로 이해할 수 없습니다.

가능한 경우 예제를 제공하십시오.

+0

$ .ajax()의 done() 메소드는 어디서 읽었습니까? AFAIK done 메서드는 $ .Deferred 개체와 관련이 있습니다. 아마 .complete()에 대해 이야기하고 있습니까? http://api.jquery.com/jQuery에서 – fcalderan

+1

아약스/페이지 –

+2

괜찮아요, 그것의 jQuery 1.8 :) 이후 $ .ajax는 jQuery 1.5에서 약속을 반환합니다 (지연의 인터페이스를 사용하여 일관성의 문제에 대한 간단한 대체) : done() success() 및 complete()에 대한 always() – fcalderan

답변

8

요약하면 ajax 함수에서 성공 콜백 함수를 분리하여 나중에 수정하지 않고 자신의 핸들러를 추가 할 수 있습니다. 원래 코드 (관찰자 패턴).

여기에서 더 자세한 정보를 찾아보세요 : https://stackoverflow.com/a/14754681/1049184

+1

그리고 그 아래 예제는 done => success, fail => error 및 always => complete의 동등성을 매핑합니다. – StuartLC

+23

이 답변은 요점을 놓칩니다. '성공 :'은 매개 변수로 사용되며'.success()'는'jqXHR'의 메소드로 사용됩니다. 후자는 더 이상 사용되지 않지만 이전은 OP가 요구 한 것입니다. – Alnitak

+1

성공/오류/완료가 더 이상 사용되지 않으며 AJAX 상태 변경을 기반으로합니다. done/fail/always는 jQuery Deferred 상태 변경을 기반으로합니다. http://api.jquery.com/category/deferred-object/를 참조하십시오. – mickeyreiss

90

success은 AJAX 호출이 성공한 경우에만 실행됩니다. 즉, 궁극적으로 HTTP 200 상태를 반환합니다. 실패하면 error이 발생하고 성공 여부와 관계없이 요청이 완료되면 complete이 발생합니다. success ($.ajax 의해 반환)을 jqXHR 개체 jQuery를 1.8

fail과 함께 alwayscomplete으로 done, error 대체되었다.

그러나 이전 구문으로 AJAX 요청을 초기화 할 수 있어야합니다. 그래서 이런 비슷한 일을 :

// set success action before making the request 
$.ajax({ 
    url: '...', 
    success: function(){ 
    alert('AJAX successful'); 
    } 
}); 

// set success action just after starting the request 
var jqxhr = $.ajax("...") 
    .done(function() { alert("success"); }); 

이 변경 jQuery를 1.5의 deferred object과의 호환성을위한 것입니다. 이연 (지금 Promise을, 크롬과 FX 전체 기본 브라우저 지원이있는) 당신이 체인에 허용 비동기 동작 : 기능의

$.ajax("parent"). 
    done(function(p) { return $.ajax("child/" + p.id); }). 
    done(someOtherDeferredFunction). 
    done(function(c) { alert("success: " + c.name); }); 

이 체인은 success으로 얻을 콜백의 중첩 된 피라미드보다 유지 보수가 용이하다.

그러나, 대신 then를 사용하는 done 지금 Promise 구문에 찬성되지 않습니다 점에 유의하시기 바랍니다 :

$.ajax("parent"). 
    then(function(p) { return $.ajax("child/" + p.id); }). 
    then(someOtherDeferredFunction). 
    then(function(c) { alert("success: " + c.name); }). 
    catch(function(err) { alert("error: " + err.message); }); 

이 채택 가치가 asyncawait는 약속 개선 구문 (및 오류 처리)를 확장하기 때문에 :

try { 
    var p = await $.ajax("parent"); 
    var x = await $.ajax("child/" + p.id); 
    var c = await someOtherDeferredFunction(x); 
    alert("success: " + c.name); 
} 
catch(err) { 
    alert("error: " + err.message); 
} 
+0

함수를 생성하고 요청한 후 함수를 설정하십시오. 둘 다 똑같은 것 같은데 ... 내게 다른 차이점을 보여 주겠어 ??? – suhailvs

+0

@suhail - 실제로는 없습니다. jQuery 1.6에는'success'가 있는데, jQuery 1.8에서는'done'으로 바뀌 었습니다. 그들은 같은 방식으로 작동하지만'done'은 나머지 jQuery와 더 일관성이 있습니다. – Keith

0

success 요청이 성공하고 $.ajax 전화의 일부입니다 때 호출되는 콜백입니다. done은 실제로 $.ajax()에 의해 반환 된 jqXHR 개체의 일부이며, jQuery 1.8에서 success을 대체합니다.

5

.success() 귀하의 웹 서버가 200 OK HTTP 헤더로 응답하는 경우 - 기본적으로 모든 것이 정상적인 경우에만 호출됩니다.

지연이 해결되면 done()에 첨부 된 콜백이 실행됩니다. fail()에 첨부 된 콜백은 지연이 거부되면 시작됩니다.

promise.done(doneCallback).fail(failCallback) 

.done() has only one callback and it is the success callback 
+2

주목할 가치가있다. 조작 된 JSON이 200/OK 상태 코드와 함께 반송되면 .success()가 호출되지 않습니다. 특히, 웹 서버 백엔드 코드에서 NaN 값을 생성하고 JavaScript NaN (즉, 'NaN'이 아닌 기호)으로 직렬화하는 문제에 봉착했습니다. 실제로 유효하지 않은 JSON입니다. JSON 실패하고 .fail()이 실행되지만 응답 상태는 200입니다. 그러나 성공은 OK 상태 코드로만 호출됩니다. 단지 그것이 OK이기 때문에 그것이 성공이라고 말하는 것은 아닙니다.) – Kasapo