비동기 처리를 간편하게 할 수 있도록 도와주는 객체이다.
명령한 기능이 정상적으로 작동되면 해당 데이터를 넘겨주며
오류가 발생할 경우 해당 오류를 잡을 수 있도록 도와준다.
프로미스에는 3가지 상태가 존재한다.
const promise = new Promise(resolve, reject) => {
console.log('doing something...')
resolve('pangho')
// reject(new Error('no network'));
}
new Promise()를 통해 생성한 promise인스턴스에는
다음과같은 메소드들이 들어있다.
all()iterable한 요소를 받아 그 요소에
promise함수의 결과를 모두 받아 올때 까지 기다렸다가
값을 모두 받으면 출력한다.
이 때 프로미스중 하나라도 거부될 경우 에러를 반환한다
race()가장 먼저(빨리) 처리된 프로미스의 결과(또는 에러)를 출력한다.
결과가 출력됐을때 다른 에러나 프로미스 함수의 결과는 무시됩니다.
resolve()프로미스함수가 제대로 실행됐다면 그 결과(데이터)를 전달하는 함수
reject()프로미스 함수가 실행 중에 어떤 문제가 발생했을 때 호출되는 함수
(프로미스 함수를 만든다)
then()프로미스 함수가 성공적으로 실행되면
그 실행값을 인자로 받아 다음 명령을 수행하는 메소드
여기서 주의할 점은 값을 바로 전달해도 되고
프로미스를 전달해도 된다.
catch()프로미스 함수가 실패했을 경우 reject()에서 값을 받아와 출력하는 메소드 .then(null,f)와 값이 똑같다.
finally()프로미스 함수의 성공 실패에 관계없이 제일 마지막에 호출되는 메소드
결과가 어떻든 마무리를 해야될 때 사용한다.
finally()는 프로미스 결과를 처리하기 위해 만들어 진 게 아니며
프로미스 결과는 finally를 통과해서 전달된다.
이런 특징은 아주 유용하게 사용되기도 한다.
프로미스를 좀더 편하게 작성할 수 있는 방법
async function f() {
return 1;
}
함수 앞에 async를 붙여주면 async 함수가 된다
이 함수는 항상 프로미스를 반환하게 된다.
프로미스가 아닌 값을 반환하더라도
이행 상태의 프로미스(resolved promise)로 값을 감싸
이행된 프로미스가 반환되도록 한다.
let value = await promise;
await는 async함수 내에서만 작동하는 키워드이다.
자바스크립트는 await 키워드를 만나면
프로미스가 처리될 때까지 함수 실행을 기다리게 만든다.
프로미스가 처리되면 그 결과와 함께 실행이 재개된다.
처리되길 기다리는 동안엔 엔진이 다른 일
(다른 스크립트를 실행, 이벤트 처리 등)을 할 수 있기 때문에,
CPU 리소스가 낭비되지 않는다.