2017-04-13 1 views
7

.fail 에 대한 짧은 문서는 "지연된 객체가 거부 될 때 호출 될 핸들러를 추가합니다."jQuery 3.2.1에서 .catch와 .fail의 차이점은 무엇입니까?

말한다

정확히 같은 말한다 .catch 에 대한 짧은 문서 : ". 연기 된 객체가 거부 될 때 추가 핸들러를 호출 할"

소스 : .catch은 그 때는 (NULL, FN)에 별명 중임 .catch 두 방법 http://api.jquery.com/category/deferred-object/

함수 인수는 다른 것 같다 및 의 문서

=> .cail을 사용해야하는 곳에 .fail과 다른 것을 사용해야하는 경우가 있습니까?

또는 하나의 기능 만 사용할 수있는 경우 다음 명령은 상호 교환 가능하며 호환성/역사적인 이유로 만 존재합니까? 나는 JQuery와 새로운 모든 약속의 조건에 아직 익숙하지 오전부터 당신은 몇 가지 예제를 제공하시기 바랍니다 수에 차이가있는 경우

https://jsfiddle.net/sq3mh9j5/

:

a) .fail(fn) 

b) .catch(fn) 

c) .then(null, fn) 

은 내가 jsFiddle를 만들었습니다.

왜 .catch의 문서는 .fail의 문서를 참조하지 않고 차이점/유사점을 명확히합니까?

편집 3.0 릴리스 노트에 .then의 동작이 변경된 것을 발견했습니다. https://blog.jquery.com/2015/07/13/jquery-3-0-and-jquery-compat-3-0-alpha-versions-released/ 그럼에도 불구하고 .fail을 사용할시기와 .catch를 사용할시기는 아직 확실하지 않습니다.

답변

1

catchfailfail 원래 약속을 반환하는 반면 그 catch이 새로운 약속을 반환에 약간 다릅니다.

// This will only output "fail" 
$.Deferred() 
    .reject(new Error("something went wrong")) 
    .fail(function() { 
    console.log("fail"); 
    }) 
    .then(function() { 
    console.log("then after fail"); 
    }) 
// This will output "catch" and "then after catch" 
$.Deferred() 
    .reject(new Error("something went wrong")) 
    .catch(function() { 
    console.log("fail"); 
    }) 
    .then(function() { 
    console.log("then after catch"); 
    }) 

Note that catch(fn) is an alias of then(null, fn).

+1

"* * 약속을 다시 확인한다"는 매우 잘못된 것입니다. 중요한 점은 새롭고 뚜렷한 약속 ('그 다음'과 똑같이)을 반환한다는 것입니다. – Bergi

+1

아, 알겠습니다. 나는 그것을 기술하는 방법을 잘 모른다 - 나는 나의 대답을 업데이트 할 것이다. 감사합니다. –

+0

그래서 정상적인 워크 플로우를 오류로 '중단/종료'하고 싶다면 ...'fail' (첫 번째 예)을 사용하고'always' 절을 구현하려면'catch ' (두 번째 예). – Stefan

1

그래서 주된 차이점은 각기 다르게 나오는 것입니다.

캐치를 사용하면 단일 기능을 실행할 수 있습니다.

실패하면 여러 가지 기능을 실행할 수 있습니다.

나는 귀하의 연구 결과에 동의합니다. 그들은 매우 유사합니다.

fail을 사용하여 두 함수를 실행하는 방법을 보여주는 예제 코드를 추가하고 catch는이 함수 만 실행합니다.

$.ajax({ 
      url: "abc" 
     }).done(function (data) { 

     }).fail(function() { 
      alert("a"); 
     }, function() { 
      alert("b"); 
     }) 
       .catch(function() { 
        alert("c"); 
       }, function() { 
        alert("d"); 
       }); 

실행하면 'a', 'b', 'c'가 표시되고 'd'가 실행되지 않습니다.

이 간단한 예제가 차이점을 보여주기를 바랍니다.

관련 문제