2016-08-29 3 views
0

약속을 사용하여 코드 흐름을 설정하려고하지만 할 수있는 작업과 수행 할 수없는 작업을 파악하지 못했습니다.Catch-> Then-> Bluebird의 예제 catch

의 내가 원하는 어디, 레지스터 기능을 가지고 있다고 가정 해 봅시다에 :

a)는 사용자 b)는 등록 과정 C 로그) D 활성화 이메일을 보내) 콜백

에 대한 답변을 반환 등록

사용자가 이미 존재하는지 확인하고 시작하지 않으면 StorageError이 던져지고 다음 catch 블록에 걸립니다. 위의 코드를 기반으로

let basicRegister = function (request: any, reply: any) { 
    let seneca = this; 
    let act = Promise.promisify(seneca.act, { context: seneca }); 

    User.getByEmail(email).then(function (user: any) { 
     throw new OperationError("Email already exists"); 
    }).catch(StorageError, function (err: any) {  
     return User.create().catch(function (err: any) { 
      throw new OperationError(err.message); 
     }); 
    }).then((user: any) => {  
     return UserActivity.create().catch(function (err: any) { 
      throw new OperationError(err.message); 
     }); 
    }).then(function (confirmationMessage: any) { 

     //how can I obtain the user object here? 

     return { ok: true, user: user }; 
    }).catch(OperationError, (error: any) => { 
     console.log(error); 
     return { ok: false, message: error.message }; 
    }).asCallback(reply); 
} 

, 나는 다음과 같은 질문이 있습니다

1 - 그것은 캐치를 다음 예에서와 같이 인터리브 정상인가를? 그렇지 않은 경우 올바른 접근 방법은 무엇입니까?

2 - then의 이전 then에서 user 개체를 얻을 수 있습니까?

사용자 개체가 오류 처리를 exists.Regarding 어디 그냥 범위에 계속할 수, 당신은 userObject로 접근에 대한 자세한 내용은

+0

확실하지 1에 대한)하지만) 2 등, 당신은'var에 finalUser를 선언 할 수있다 '(또는에서 무엇이든은'finalUser = user'을 User.getByEmail''전에 라인)의 논리 소리와 두 번째'.then()'블록을 사용하므로'finalUser' 변수가 최종'then()'블록에서 사용 가능합니다 – Fissio

+0

제안이 잘 작동했습니다. 감사합니다! –

답변

1

필요하면 알려주세요 : 당신은 맨 끝에 오류를 잡을 필요 . 그들은 어쨌든 약속의 사슬을 통과하게됩니다.

let basicRegister = function(request: any, reply: any) { 
    let seneca = this; 
    let act = Promise.promisify(seneca.act, { 
     context: seneca 
    }); 

    User.getByEmail(email).then(function(user: any) { 
     throw new OperationError("Email already exists"); 
    }).catch(StorageError, function(err: any) { 
     return User.create(); 
    }).then((user) => { 
     return UserActivity.create() 
      .then((confirmationMessage) => { 
       return { 
        ok: true, 
        user: user 
       }; 
      }); 
    }).catch(OperationError, (error: any) => { 
     console.log(error); 
     return { 
      ok: false, 
      message: error.message 
     }; 
    }).asCallback(reply); 
} 
+0

"약속 지옥"을 피하려고했는데, 아마도 Fissio의 코멘트가 더 잘 작동 할 수 있습니다. 당신의 대답에 관해서, 첫 번째 catch 문을 체인의 끝으로 옮길 수 있다는 것을 의미합니까? 결과를'then' 문장으로 "전달"할 수 있습니까? –

+0

@ManuelReis 아니요. 오류가없는 블록으로 변환 할 때 첫 번째 캐치가 필요 없습니다. 하지만 다른 모든 잡을 없앨 수 있습니다. –

+0

예, 맞습니다.이 특별한 예에서는'catch' 문을 제거 할 수 있습니다. 그러나 실제로 이러한 캐치를 사용하여 오류 메시지를 사용자 정의합니다. 따라서, 'catch' ->'then' ->'catch' 문을 삽입하는 것이 맞습니까? –