2015-01-11 5 views
2

약속 라이브러리로 Q.js을 사용하고 있습니다. 나는 같은과 중첩을 제거 할 수 있음을 알게 해주기약속 체인에서 오류 처리

function X() { 
    return Q.Promise(function(resolve, reject) { 
     Users.find() 
      .then(function(user) { 
       Q.all([ 
        getUserProfileInfo(user), 
        getUserSomethingElse(user) 
       ]) 
        .spread(function(profile, something) { 
         // do stuff 

         resolve(); 
        }) 
        .catch(function(err) { 
         // handle error for Q.all() 

         reject(); 
        }) 
      }) 
      .catch(function(err) { 
       // handle error for User.find() 

       reject(); 
      }); 
    }); 
} 

:하지만 이전과 같은 코드 프로그래머

function X() { 
    return Q.Promise(function(resolve, reject) { 
     return Users.find() 
      .then(function(user) { 
       return Q.all([ 
        getUserProfileInfo(user), 
        getUserSomethingElse(user) 
       ]); 
      }) 
      .spread(function(profile, something) { 
       // do stuff 

       resolve(); 
      }) 
      .catch(function(err) { 
       // now how do I differenciate between 
       // the errors from Users.find() and Q.all()? 

       reject(); 
      }); 
    }); 
} 

은 "문제는"나는 바닥에있는 (평평) 버전은 어떻게입니다 나는 Users.find()Q.all()에서 오류를 구분합니까? 또는 일반적으로 then 체인의 다른 많은 오류가 있습니까?

현재 내가

function(err) { 
    if (err.errors && err.statusCode) { 
     // do something 
    } else if (err.message) { 
     // do something 
    } 
} 

같은 것을 사용할 수 있습니다 그러나 이것은 "좋은"코드 isit 하 정말 아니다? 더 좋은 방법이있을거야?

사용자를 찾는 데 문제가있는 경우
+1

[지연 반 패턴이란 무엇이며 어떻게 피할 수 있습니까?] (http://stackoverflow.com/questions/23803743/what-is-the-deferred-antipattern-and-how-do-i-avoid- 그것) –

+1

다른 부분의 오류를 구별하려면 중첩에 문제가 없습니다. – Bergi

답변

2

당신은 지금이

function X() { 
    return Q.Promise(function(resolve, reject) { 
     return Users.find() 
      .catch(function(err) { 
       // Handle user finding error 
       throw new Error("Problem in finding users"); 
      }) 
      .then(function(user) { 
       return Q.all([ 
        getUserProfileInfo(user), 
        getUserSomethingElse(user) 
       ]); 
      }) 
      .spread(function(profile, something) { 
       // do stuff 

       resolve(); 
      }) 
      .catch(function(err) { 
       reject(); 
      }); 
    }); 
} 

처럼 여러 catch 블록을 사용할 수는 첫 번째 catch 블록이 실행되고 해당에서 Error를 던지고 있기 때문에, 그것을 체인에있는 다음 catch 블록에 도달합니다. Users.find에 오류가 없으면 컨트롤이 직접 then 블록으로 이동합니다.