$ .ajax의 성공과 .done () 메서드의 차이점은 무엇입니까


102

누구든지 나를 도울 수 있습니까? 과 의
차이점을 이해할 수 없습니다 .success.done()$.ajax

가능하다면 예를 들어주세요.


$ .ajax ()의 done () 메서드에 대해 어디서 읽었습니까? AFAIK done 메소드는 $ .Deferred 객체와 관련이 있습니다. 대신 .complete ()에 대해 이야기하고 있습니까?
Fabrizio Calderan


2
좋아요, 그것은 jQuery 1.8입니다 :) $ .ajax가 jQuery 1.5에서 약속을 반환하기 때문에 이것은 일관성 문제에 대한 간단한 대체입니다 (deferred 인터페이스 사용) : done () 대신 success (), fail () for error () 항상 () ()에 완료
파브리 지오 Calderan

2
실제 변경 사항은 프로그래밍 방식으로 여러 콜백을 연결할 수 있다는 것입니다. $ .Deferred 문서 페이지를보십시오.
Fabrizio Calderan

답변:


8

간단히 말해, 성공 콜백 함수를 ajax 함수에서 분리하여 나중에 원래 코드 (관찰자 패턴)를 수정하지 않고도 고유 한 핸들러를 추가 할 수 있습니다.

여기에서 자세한 정보를 확인하십시오 : https://stackoverflow.com/a/14754681/1049184


1
그리고 그 아래 예제는 done => success, fail => error 그리고 always => complete
StuartLC

25
이 대답은 요점을 놓칩니다. 사이의 차이가 success: 파라미터로서 사용하고 .success()A의 방법으로이 jqXHR. 후자는 더 이상 사용되지 않지만 전자는 OP가 요청한 것입니다.
Alnitak 2012-08-23

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

28
나는 질문을 잘못 해석하는 대답이 가장 많이 득표 된 것과 수용된 해결책이라는 것을 믿을 수 없습니다 ...
Transcendence

108

successAJAX 호출이 성공한 경우에만 발생합니다. 즉, 궁극적으로 HTTP 200 상태를 반환합니다. 성공 여부에 관계없이 error실패하고 complete요청이 완료되면 발생합니다 .

온 jQuery를 1.8에서 jqXHR객체 (에 의해 반환 $.ajax) success로 대체 done, errorfailcomplete함께 always.

그러나 이전 구문으로 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 (현재 Promise, Chrome 및 FX에서 완전한 기본 브라우저 지원을 제공함)를 사용하면 비동기 작업을 연결할 수 있습니다.

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

이 함수 체인은에서 얻는 중첩 된 콜백 피라미드보다 유지 관리가 더 쉽습니다 success.

그러나 done이제는 대신 Promise사용 하는 구문을 위해 더 이상 사용되지 않습니다 then.

$.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); });

이 가치 채택을 때문에 async그리고 await약속을 향상 구문 (및 오류 처리) 확장 :

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

요청하기 전에 함수 생성을하고 요청 후 함수를 설정합니다. 둘 다 똑같은 것 같습니다 ... 다른 차이점을 보여 주시겠습니까 ???
suhailvs

@suhail-실제로는 없습니다. jQuery 1.6에서는 successjQuery 1.8에서 done. 동일한 방식으로 작동하지만 done나머지 jQuery와 더 일관성이 있습니다.
Keith

@Keith 오늘, .done을 사용하는 것은 성공을 사용하는 것과 동일합니까? 아니면 더 새로운 것이 있습니까?
Roxy'Pro

@ Roxy'Pro 이것은 내가 대답했을 때 구식이었고 2018 년에는 확실히 사용하지 않을 것입니다 .done. jQuery의 초기 (그리고 이제 막 다른) 찌르는 일 Promise이었고 이제는 상당히 포괄적 인 언어 지원이 있습니다. 새 프로젝트에서는 const response = await fetch(...)대신 사용 합니다.
Keith

6

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

done ()에 첨부 된 콜백은 지연이 해결 될 때 시작됩니다. fail ()에 연결된 콜백은 지연이 거부 될 때 시작됩니다.

promise.done(doneCallback).fail(failCallback)

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

3
잘못된 JSON이 200 / OK 상태 코드와 함께 다시 전송 될 때 .success ()가 호출되지 않는다는 점에 주목할 가치가 있습니다. 특히 웹 서버 백엔드 코드에서 NaN 값을 생성하고 실제로 유효한 JSON이 아닌 자바 스크립트 NaN (즉, 문자열 'NaN'이 아닌 기호로)으로 직렬화하는 문제가 발생했습니다. 따라서 응답을 JSON으로 구문 분석합니다. 실패하고 .fail ()이 실행되지만 응답 상태는 200입니다. 그러나 성공은 OK 상태 코드로만 호출되는 것이 여전히 사실입니다. 단지 단지의 확인을하기 때문에, 그것의 'success'ful 의미하지 않는다는 것을 지적하고 싶었)
Kasapo

1

success요청이 성공할 때 호출되고 $.ajax호출의 일부인 콜백입니다 . done실제로에서 jqXHR반환 된 객체의 일부이며 jQuery 1.8에서 $.ajax()대체 success됩니다.

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