2014-12-08 5 views
1

저는 AngularJS에서 약속을 묶는 방법을 조금 혼란스럽게 생각합니다. 나는이 내 포인트를 얻을 수있는 몇 가지 간단한 코드 ... $resource 구현이 있습니다각도 약속 및 오류

myResource 
    .save({ id: 123 }) 
    .$promise 
    .then(function(data) { 
     // redirect to root on success 
     $location.url("/"); 
    }) 
    .catch(function() { 
     console.log("Failed"); 
    }) 
    .finally(function() { 
     // reenable form 
     $scope.enabled = true; 
    }) 

무엇 내 .catch() 기능에만 잡을 것입니다 내 자원 절약 실패 할 때 호출 또는됩니다 여부에 대해 내가 혼란 스러워요 .then()에서 발생하는 오류 또는 둘 다?

체인을 연결할 때 체인에서 발생한 모든 오류를 catch하는 경우 .catch (.finally) 전에 어떻게 처리 할 수 ​​있습니까?

참고 : .save 함수에서 성공과 오류 함수를 제공 할 수 있지만 다른 부분도 처리 할 수 ​​있다는 것을 알고 있습니다.

답변

0

우선 Angular's implementation of promises의 문서를 읽으십시오.

약속은 성공적 (resolve 방법) 또는 적용되지 않음 (reject 방법)의 두 가지 방법으로 해결할 수 있습니다.

리소스를 저장할 수없는 경우 (예 : 서버가 2XX 상태로 응답하지 않은 경우) 약속이 거부되므로 catch 메소드가 호출됩니다.

또한 catch 처리기는 다음 가능한 처리기에 대한 약속을 거부해야합니다. catch 메소드에서 거부되지 않은 값을 반환하면 오류가 처리 된 것으로 간주되어 promise는 후속 then 메서드 (있는 경우)를 호출 할 수 있습니다. 약속이 다른 곳에서 사용하는 것이 가능성이있는 경우 따라서, 당신의 코드는 다음과 같아야합니다

또한
// inject $q 
myResource 
.save({ id: 123 }) 
.$promise 
.then(function(data) { 
    // redirect to root on success 
    $location.url("/"); 
}) 
.catch(function() { 
    console.log("Failed"); 
    return $q.reject(); 
}) 
.finally(function() { 
    // reenable form 
    $scope.enabled = true; 
}) 

당신이 then 방법에 오타를 한 것으로 알 - 당신은 "ULR"대신 "URL을 썼다 ".

+0

필자는 문서를 읽었지만, 예상했던 것만 큼 명확하지는 않습니다. (각도 문서에서는 상당히 평범한 것으로 나타났습니다. 잘못된 것은 아니지만 때로는 중요한 세부 사항이 누락되었습니다.) 내가 주로 찾던 것은'.catch' 호출이'.then'과 관련되어 위치 할 때 어떤 차이가 있는지 여부였습니다. 그리고 최종 결과 (몇 가지 테스트를했습니다)는 모든 .catch는 이전에'.catch'가있을 경우 모든 것을 처리한다는 것입니다. ... 또한 이전에보고 된 해결/거부 된 상태에 따라 다릅니다. –