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에서 한 번에 처리할 수 있습니다. 하지만 모든 콜백 함수를 위와 같이 바꿀 수 있는 것은 아닙니다. 메서드가 프로미스 방식을 지원해야 합니다.

    예제의 코드는 findOnesave 메서드가 내부적으로 프로미스 객체를 갖고 있다고 가정했기에 가능합니다(new Promise가 함수 내부에 구현되어 있어야 합니다). 지원하지 않는 경우 콜백 함수를 프로미스로 바꿀 수 있는 방법은 3.5.6절에 나와 있습니다.

    프로미스 여러 개를 한 번에 실행할 수 있는 방법이 있습니다. 기존의 콜백 패턴이었다면 콜백을 여러 번 중첩해서 사용해야 했을 것입니다. 하지만 Promise.all을 활용하면 간단히 할 수 있습니다.

    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.