function findAndSaveUser(Users) { Users.findOne({}) .then((user) => { user.name = 'zero'; return user.save(); }) .then((user) => { return Users.findOne({ gender: 'm' }); }) .then((user) => { // 생략 }) .catch(err => { console.error(err); }); }
코드의 깊이가 세 단계 이상 깊어지지 않습니다. 위 코드에서 then 메서드들은 순차적으로 실행됩니다. 콜백에서 매번 따로 처리해야 했던 에러도 마지막 catch에서 한 번에 처리할 수 있습니다. 하지만 모든 콜백 함수를 위와 같이 바꿀 수 있는 것은 아닙니다. 메서드가 프로미스 방식을 지원해야 합니다.
예제의 코드는 findOne과 save 메서드가 내부적으로 프로미스 객체를 갖고 있다고 가정했기에 가능합니다(new Promise가 함수 내부에 구현되어 있어야 합니다). 지원하지 않는 경우 콜백 함수를 프로미스로 바꿀 수 있는 방법은 3.5.6절에 나와 있습니다.
프로미스 여러 개를 한 번에 실행할 수 있는 방법이 있습니다. 기존의 콜백 패턴이었다면 콜백을 여러 번 중첩해서 사용해야 했을 것입니다. 하지만 Promise.all을 활용하면 간단히 할 수 있습니다.