2014-06-06 2 views
8

저는 약속의 세계에 익숙하지 않아 어떤 경우에 사용법을 완전히 이해하고 있는지 확신 할 수 없습니다.Express.js에서 Sequelize 약속 실행 중지

내 코드를보다 쉽게 ​​읽을 수 있도록 최근에 추가 된 지원 약속을 따르십시오. 일반적인 시나리오는 무한 콜백에서 오류를 여러 번 처리하지 않는 것입니다. 아래 코드는 항상 204을 반환하지만 사진을 찾을 수없는 경우 404을 반환하고 싶습니다.

404를 보낸 후 Promise 체인의 실행을 "중지"하도록 Sequelize에 지시하는 방법이 있습니까? res.send은 비동기 적이므로 실행이 중지되지 않습니다.

// Find the original photo 
Photo.find(req.params.id).then(function (photo) { 
    if (photo) { 
     // Delete the photo in the db 
     return photo.destroy(); 
    } else { 
     res.send(404); 
     // HOW TO STOP PROMISE CHAIN HERE? 
    } 
}).then(function() { 
    res.send(204); 
}).catch(function (error) { 
    res.send(500, error); 
}); 

물론이 예제는 간단하며 콜백으로 쉽게 작성할 수 있습니다. 그러나 대부분의 경우 코드가 길어질 수 있습니다.

+0

는 당신이 필요로하는 약속을 표시하는 방법입니다 . 나는 후유증에 익숙하지 않다.하지만 나는 그럴 수있는 방법이 있어야한다고 생각한다. –

+0

감사합니다. 내가 아는 유일한 것은 Sequelize가 Bluebird를 사용한다는 것입니다. 그러나 API에서 약속 체인을 막을 수있는 어떤 것도 표시되지 않습니다. – Pedro

+1

'then' 핸들러 안에'throw '하면 체인을 거부합니다. 또한 결과가 발견되지 않으면 찾기 호출을 자동으로 거부하는 [공개 문제] [https://github.com/sequelize/sequelize/issues/272]가 있습니다. 기능이 필요한 경우 지원을 음성으로들을 수 있습니다. –

답변

6

약속 체인이 반드시 선형 일 필요는 없습니다. 실패 사례에 대해 별개의 (더 짧은) 약속 체인을 가지면서 필요한 경우 많은 수의 .then()을 체인으로 연결하여 성공 사례에 대해 별도의 약속 체인을 만들 수 있습니다.

은 개념적으로, 그 다음과 같습니다

  Photo.find 
     / \ 
     /  \ 
    (success) (failure) 
    /   \ 
    /   \ 
photo.destroy res.send(404) 
    | 
    | 
res.send(204) 

그리고 실제 코드에서 다음과 같습니다

: 그 시점에서 해결로

// Find the original photo 
Photo.find(req.params.id).then(function (photo) { 
    if (photo) { 
     // Delete the photo in the db 
     return photo.destroy().then(function() { 
      res.send(204); 
     }); 
    } else { 
     res.send(404); 
    } 
}).catch(function (error) { 
    res.send(500, error); 
}); 
+0

그래, 내가 그 일을 끝내 었어. Sequelize가 너무 많은 중첩 된 코드를 피하기 위해'find()'약속을 거부 할 것으로 기대하고있었습니다. 마지막 질문 :'destroy()'약속에도'catch()'를 추가해야하는지 알고 계십니까? 아니면 마지막에 캐치로 처리할까요? 감사! – Pedro

+0

@PedroCheckos,'Photo.destroy()'약속 체인 내에서 별도의'catch()'블록을 정의하지 않는 한 처리되지 않은 예외는 바깥 쪽'catch()'블록에 "버블 업"해야합니다. –

+0

신난다. 그것은 내가 알아야 할 필요가있다. 도움말을 많이 주셔서 감사합니다 :) – Pedro