2014-01-21 9 views
53

이것은 바보 같은 질문 일 뿐이지 만 중간 약속의 사슬인데, 어떻게 그 기능 중 하나에서 약속을 거부합니까? 예 :내부에서 약속을 거부하는 방법

someActionThatReturnsAPromise() 
    .then(function(resource) { 
     return modifyResource(resource) 
    }) 
    .then(function(modifiedResource) { 
     if (!isValid(modifiedResource)) { 
      var validationError = getValidationError(modifiedResource); 
      // fail promise with validationError 
     } 
    }) 
    .catch(function() { 
     // oh noes 
    }); 

더 이상 원래 해결/거부 기능 또는 PromiseResolver에 대한 참조가 없습니다. 방금 return Promise.reject(validationError);을 추가해야합니까?

+1

과 같을 것이다 있을까? – thefourtheye

+1

'throw validationError' – kavun

+0

><나는 어리석은/쉬운 것 같은 느낌이었습니다. 필자는 계속해서 전용 거부 기능을 호출하거나 실패한 Promise를 반환해야한다고 생각했습니다. 따라서 약속/성사의 내부에서 새로운 약속이 아닌 반환 값은 해결 된 값으로 간주됩니까? 그리고 오류가 발생하면 바로 거부 된 약속을 반환하는 것과 동일합니까? 답변을 게시하면 받아 들일 것입니다. – chinabuffet

답변

62

나는 단지 return Promise.reject(validationError);을 추가하겠습니까?

예. 그러나, Promise/A+ 호환 라이브러리 만 jQuery를에 it's that complicated, 당신은 단순히

throw validationError; 

그래서 당신의 코드는 예외를 발생

someActionThatReturnsAPromise() 
    .then(modifyResource) 
    .then(function(modifiedResource) { 
     if (!isValid(modifiedResource)) 
      throw getValidationError(modifiedResource); 
     // else ! 
     return modifiedResource; 
    }) 
    .catch(function() { 
     // oh noes 
    }); 
+0

이것을하기 정상적인가? 널리 사용됩니까? '.catch' 코드가 없으면 ** 전체 ** 앱이 언밸런스 오류로 폭파 할 것이기 때문에 나쁘다고 생각합니다. –

+2

Promise/A + 호환 라이브러리에서 'then'에 대한 'handler'는 sync이고 예외는 catch 될 수 있습니다. 핸들러가 비동기이면 결국 거부 할 것이라는 약속을 반환해야합니다. 항상 던지는 대신 Promise.reject()를 반환하면 나에게 의미가 있습니다. 왜냐하면 비동기 처리기를 던지면 라이브러리가 그 핸들을 잡을 수 없으므로 자동으로 전달됩니다. 조심하십시오. –

+1

@MikeGleasonjrCouturier : 약속에'.then' 핸들러가없는 비동기 핸들러가 있어서는 안됩니다 :-) 당신이 약속하지 않은 API를 사용한다면,'return Promise.reject()'도 도움이 될 것입니다. – Bergi