Javascript

Promise, async / await [node.js 교과서]

muyeon 2023. 4. 8. 17:56
본 게시글은 node.js 교과서 강의를 듣고 정리한 글입니다.

 

콜백지옥

- 콜백 헬이라고 불리는 지저분한 자바스크립트 코드의 해결책이다.

- Promise : 내용이 실행은 되었지만 결과를 아직 반환하지 않은 객체

- then 을 붙이면 결과를 반환한다.

- 실행이 완료되지 않았으면 완료된 후에 then 의 내부함수가 실행된다.

const condition = true;

const promise = new Promise((resulve, reject) ⇒ {
    if(condition) {
        resolve(’성공’);
    } else {
         reject(’실패’);
    }
});

promise.then((message) ⇒ {
	console.log(message);
})
.catch((err) ⇒ {
	console.log(err);
}

- Resolve (성공 리턴값 ) -> then 으로 연결

- Reject (실패 리턴값) -> catch 로 연결

- Finally 부분은 무조건 실행됨

- 성공했든 실패했든 그 값을 계속 프로미스가 들고 있다가 나중에 프로미스에다가 then 이나 catch 를 붙여서 받을 수 있다.

- 코드를 분리할 수 있냐 없냐 가 가장 큰 차이이다.

 

Promise.all(배열) : 여러개의 프로미스를 동시에 실행

- 하나라도 실패하면 catch 로 간다.

- allSettled 로 실패한 것만 추려낼 수 있다.

 

async / await

async function findAndSaveUser(Users){
    let User = await Users.findOne({});

    [user.name](http://user.name) = ‘zero’;

    user = await user.save();

    user = await Users.findOne({gender: ‘m’});

//생략

}

- 변수 = await 프로미스; 인 경우 프로미스가 resolve 된 값이 변수에 저장

- 변수 await 값; 인 경우 그 값이 변수에 저장

- await 이 then 역할을 한다고 보면된다.

- async 함수에서 리턴한 것들은 무조건 then 이나 await 으로 받아야 한다.

 

for await ( 변수 of 프로미스 배열 )

 

const promise1 = Promise.resolve(’성공1’);
const promise2= Promise.resolve(’성공2’);
        (async () ⇒ {
            for await (promise of [promise1, promise2]) {
            console.log(promise);
        }
    })();

- resulve 된 프로미스가 변수에 담겨 나온다.

- await 을 사용하기 때문에 async 함수 안에서 해야함