콜백
function findAndSaveUser(Users){ Users.findOne({},(err,user) => { // 첫번째 콜백 if(err){ return console.error(err); } user.name = 'ricter' user.save((err) => { // 두번째 콜백 if(err){ return console.error(err); } Users.findOne({gender:'m'},(err,user) => { // 세번째 콜백 if(err) { return console.error(err); } }); }); }); }위의 코드는 콜백 함수가 세번 중첩되어 있어 콜백 함수 마다 코드의 깊이도 깊어지고 에러도 따로 처리해줘야한다
프로미스
function findAndSaveUser(Users){ Users.findOne({}).then((user) => { user.name ='rickter', return user.save(); }).then((user) => { return Users.findOne({gender:'m'}); }).catch(err => { console.error(err); }); }코드가 더 깊어지지 않고 then 메서드들이 순차적으로 실행된다.
콜백에서 매번 따로 처리해야 했던 에러도 마지막 catch에서 한번에 처리 가능해졌다.
위의 방법은 메서드가 프로미스 방식을 지원해야지만 이렇게 바꿀 수 있는데 findOne과 save 메서드가 프로미스 객체를 가지고 있어 가능한 것이다.
프로미스 여러개를 한 번에 실행하는 방법
const promise1 = Promise.resolve('성공1'); const promise2 = Promise.resolve('성공2'); Promise.all([promise1,promise2]) .then((result) => { console.log(result); // ['성공1','성공2'] }) .catch((error) => { console.error(error); }); 실행결과 : ['성공1','성공2']Promise.resolve는 즉시 resolve 하는 프로미스를 만드는 방법이다.
비슷한 것으로 즉시 reject 하는 Promise.reject도 있다.
프로미스가 여러개 있을 때 Promise.all에 넣으면 모두 resolve 될 때까지 기다렸다가 then으로 넘어간다.
result 매개변수에 각각 프로미스 결괏값이 배열로 들어 있다.
Promise 중 하나라도 reject가 되면 catch로 넘어간다.