2016-07-29 1 views
1

나는 ES6의 사슬의 상황을 알 수있다. 체인의 첫 번째 약속은 캐시를 처음부터 새로 고칠 수 있는지 여부를 결정하는 비동기 메서드이며 체인의 후속 메서드는 실제 새로 고침을 수행합니다.ES6 Promise 체인에서 벗어날 수있는보다 우아하고 직관적 인 방법이 있습니까?

첫 번째 방법으로 캐시를 실제로 새로 고쳐서는 안된다고 판단되면 체인 밖으로 폭탄을 떨어 뜨리고 싶습니다. 나머지는 할 필요가 없습니다.

내가이 작업을 수행 할 수 있었던 유일한 방법은 테스트 메소드의 결과를 저장하고 체인의 각 후속 .then()에 실제로 무언가를 수행 할 것인지 또는 테스트를 반환 할 것인지 테스트하는 것입니다. 간단한 Promise.resolve (null).

이것은 실제로있을 필요가없는 여분의 어리석은 코드처럼 보입니다.

아래 코드가 작동합니다 .... 오류 처리가 올바르지 만 .... 조건부로 체인을 계속 사용하려는 패턴을 코딩하는 더 좋은 방법이 있습니까? 답변을 저장하지 않고 그 다음에 Promise.resolve()를 강제 실행하지 않는 방법?

function asyncRefreshCache(wDb, forceRefresh) { 
    var cachedDataVersions; 
    var allowRefresh; 
    return wDb.asyncCacheRefreshAllowed(forceRefresh) // Here I test whether I am allowed to really refresh the cache. 
     .then(function (ar) { 
      allowRefresh = ar; 
      return allowRefresh 
       ? wDb.asyncGetCacheDataVersionsForRefresh() // Only do this if allowed above. 
       : Promise.resolve(null); //Yuck. Would love to just break out. But how? 
     }) 
     .then(function (dataVersions) { 
      cachedDataVersions = dataVersions; 
      return allowRefresh 
       ? asyncServerFlexSearch({ dataVersions: dataVersions, includeInactiveFlag: true, onLoadFlag: true }) // Only do this if allowed above. 
       : Promise.resolve(null); //Yuck. Would love to just break out. But how? 
     }) 
     .then(function (serverResponse) { 
      return allowRefresh 
       ? wDb.asyncMergeCleanDataFromServerToCache(cachedDataVersions, serverResponse) // Only do this if allowed above. 
       : Promise.resolve(null); //Yuck. Would love to just break out. But how? 
     }); 
} 

편집 :이 질문 때문에 Q의 약속과 JQuery와의 약속에 대해 비슷한 질문의 중복으로 표시되었습니다. JQuery의 약속은 evern의 약속이 아닙니다. 따라서 ES6 Promises의 사양과 구현이 겉으로보기에 중요한 필요성과 사용 사례를 수용 할 것이라는 것이 나의 초기 희망이었습니다. 이것이 사실이 아닐 수도 있습니다. 따라서 다른 질문에 대한 대답은이 질문에 대한 "정확한"대답 일지 모르나 ES6 약속에 관한 내용은 아닙니다. 그래서 그것은 나에게는 다른 것처럼 보입니다.

+0

에서 오류 및 프로세스 오류 메시지 또는 거부 약속 이유를 처리, .then()에서 Promise.reject()를 사용하여 패턴은 정확히 동일합니다. – Bergi

답변

3

이 패턴을 코딩하는 더 좋은 방법이 있는데, 여기서는 만 조건부로 체인을 계속 사용 하시겠습니까?

당신 수 throwError 또는 내가이 중복되지 대한 ES6 약속입니다 중요합니까 생각하지 않는다 .catch()

+0

답을 고맙게 생각하고 어떻게 작동하는지 알지만 예상 된 프로그램 흐름을 제어하기 위해 예외 (또는 거부)를 사용하는 것은 문제가있는 것처럼 보입니다. 그리고 특별히 읽을 수도 없습니다. 내 솔루션만큼이나 문제가있는 것 같습니다. 최선의 해결책이 약속을 중첩하는 것인가 궁금합니다. –

+0

답변 하나만 가능한 접근 방식을 보여줍니다. '.then()'에서'null' 값을 검사하고 Question에서 기존 패턴을 사용할 수도 있습니다. .then()가 새로운'Promise'를 반환하기 때문에'Promise.resolve (null)'을 사용할 필요가 없다. 당신은 값이'.then()'에 반환 된 값으로'null'만으로 3 진을 사용할 수 있습니다. 던지기 오류는'.then (onFulfilled)'을 우회합니다. – guest271314

관련 문제