executor
(실행자, 실행 함수)는 new Promise
가 만들어질 때 자동으로 실행된다.executor
에서 원하는 일이 처리된다.콜백(resolve, reject)
중 하나는 반드시 호출되어야 한다.이행(fulfilled)
, 거부(rejected)
, 대기(pending)
상태를 통해 비동기 동작 처리Promise.resolve()
로 성공한 객체 생성 Promise.resolve(100);
new Promise(resolve => resolve(100));```
Promise.reject()
로 실패한 객체 생성 Promise.reject('error!');
new Promise((_, reject) => reject('error!'));```
.then
의 첫번째 인수는 프라미스가 이행(fulfilled)되었을 때 실행되는 함수이고, 이곳에서 실행 결과를 받는다..then
의 두번째 인수는 프라미스가 거부(rejected)되었을 때 실행되는 함수이고, 이곳에서 에러를 받는다. promise.then(
result => alert(result), // 1초 후 "완료!"를 출력
error => alert(error) // 실행되지 않음
);
promise
객체는 다음 then
에서 처리fetch('http://example.com/movies.json')
.then((res) => res.json()) //promise object type
.then((data) => console.log(data)) // object type
.catch(err => console.err(err));
promise
객체가 아닌 값을 반환할 때는 성공한 promise
처럼 생각fetch('http://example.com/movies.json')
.then((res) => res.status) //object type
.then((data) => console.log(data))
.catch(err => console.err(err));
fetch('http://example.com/movies.json')
.then(value => value)
.then((data) => console.log(data));
fetch('http://example.com/movies.json')
.then('data')
.then((data) => console.log(data));
.then(undefined, 실패시콜백)
의 단축 문법.catch
후에도 .then
을 계속 사용할 수 있다. new Promise((resolve, reject) => {
console.log("시작")
resolve();
console.log("시작2")
})
.then(() => {
throw new Error("실패!")
console.log("")
})
.catch(() => {
console.error("실패시 실행")
})
.then(() => {
console.log("이건 꼭 실행하세요.")
})
new Promise((resolve, reject) => {
console.log("시작")
resolve();
console.log("시작2")
})
.then(() => {
throw new Error("실패!")
console.log("")
})
.then(undefined, () => {
console.error("실패시 실행")
})
.then(() => {
console.log("이건 꼭 실행하세요.")
})
.then(결정시콜백)
과 비슷한 느낌finally
에서는 프라미스가 이행되었는지, 거부되었는지 알 수 없다.finally
는 자동으로 다음 핸들러의 결과와 에러를 전달한다. new Promise((resolve, reject) => {
setTimeout(() => resolve("결과"), 2000)
})
.finally(() => alert("프라미스가 준비되었습니다."))
.then(result => alert(result));// <-- .then에서 result를 다룰 수 있음
new Promise((resolve, reject) => {
throw new Error("에러 발생!");
})
.finally(() => alert("프라미스가 준비되었습니다."))
.catch(err => alert(err)); // <-- .catch에서 에러 객체를 다룰 수 있음
.then
만 있으면 나머지 두 개는 구현/대체 가능.then()
이 있으면 promise
처리가 가능promise.any
: 가장 먼저 이행된 값을 이행, 모두 실패하면 실패promise.all
: 모두 이행되면 값 배열로 전달하며 이행, 하나라도 실패하면 실패promise.race
: 가장 먼저 결정된 값에 따라 결정promise.allSettled
: 모두 결정되면 결과 객체 배열이 전달되며 이행.status
: "fulfilled" 또는 "rejected".value
: "fulfilled"된 경우에만 존재.reason
: "rejected"된 경우에만 존재.then/.catch/.finally
는 항상 비동기로 실행된다. let promise = Promise.resolve();
promise.then(() => alert("프라미스 성공!"));
alert("코드 종료");
Promise
를 반환하는 함수async
가 앞에 붙는 함수는 항상 프라미스를 반환한다. async function f() {
return 1;
}
f().then(alert); // 1
async function f() {
return Promise.resolve(1);
}
f().then(alert); // 1
await
연산자를 내부에 사용하는 함수Promise
를 반환해야하는 것과 await
연산자를 내부에 쓸 필요가 없으면 async를 사용할 필요가 없다.Promise
상태가 결정될 때까지 대기 async function one() {
return new Promise(resolve => setTimeout(() => resolve(1230)))
.then(v => v+4)
.catch(e => console.error(e));
}
const num = await one();
console.log(num) // 1234 출력
const num = await {
then(fulfill) { fulfill(123) }
}
console.log(num)
console.log(await "hello");
await
은 promise.then
보다 더 세련되게 프라미스의 결과 값을 얻을 수 있게 해준다.try/catch
를 사용한다.microtask queue
에 넣는다.async/await과 promise.then/.catch
- async/await을 사용하면 await이 대기처리를 해주기 때문에 then이 거의 사용되지 않는다.
- 또한 .catch보다 try/catch를 사용할 수 있게 된다.
- 그렇지만 문법적 제약(함수안에서 await을 사용할 수 있는) 때문에 .then/.catch를 추가해 처리하지 못한 에러나 최종 결과를 도출 할 수 있다.
async/await는 Promise.all과도 함께 쓸 수 있다.
[패스트캠퍼스] <개발 세미나 : D-day Vol. 2> 자바스크립트 비동기 처리
모던 자바스크립트 - 프라미스와 async, await