: 비동기 작업의 최종 완료 또는 실패를 나타내는 객체
const pr = new Promise((resolve, reject) => {
// resolve : 성공한 경우 실행되는 함수
// reject : 실패한 경우 실행되는 함수
});
참고 : resolve(), reject() = callback 함수
- callback 함수 : 어떤 일이 완료된 이후 실행되는 함수
https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Using_promises
new Promise 생성자가 반환하는 promise 객체 : state, result를 프로퍼티로 가짐
(1) 초기
(2) resolve(value) - 성공
(3) reject(error) - 실패
// (2) 성공을 가정한 코드
const pr = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Ok'); // resolve = 성공 시 실행할 함수
}, 2000);
});
// (3) 실패를 가정한 코드
const pr2 = new Promise((resolve, reject) => {
setTimeout(() => {
reject(new Error('error...'))
}, 2000)
});
(1) 초기
(2) resolve(value) - 성공
(3) reject(error) - 실패
여기까지가 판매자의 코드라고 볼 수 있다.
- 판매자는 주문을 받으면 그 주문을 처리하고, 결과가 성공인지 실패인지 알려줌.
const pr = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('OK')
}, 2000)
});
pr.then(
// then을 이용하여 resolve와 reject를 처리할 수 있음
function(result){
console.log(result + '완료되었어!');
},
// provise 함수가 resolve로 실행되었기 때문에, 두 번째 callback은 실행되지 않음.
function(err){
console.log(err + '실패.. 다시 주문해주세요');
}
)
// OK완료되었어!
첫 번째 함수 function(result){}
const pr = new Promise((resolve, reject) => {
setTimeout(() => {
reject(new Error('err..'))
}, 2000)
});
pr.then(
// then을 이용하여 resolve와 reject를 처리할 수 있음
function(result){
console.log(result + '완료되었어!');
},
function(err){
console.log(err + '실패.. 다시 주문해주세요');
}
)
// Error: err..실패.. 다시 주문해주세요
두 번째 함수 function(err){}
const pr = new Promise((resolve, reject) => {
setTimeout(() => {
reject(new Error('err..'))
}, 2000)
});
pr.then(
// then을 이용하여 resolve와 reject를 처리할 수 있음
function(result){
console.log(result + '완료되었어!');
}
).catch(
function(err){
console.log(err + '실패.. 다시 주문해주세요');
}
).finally(
function(){
console.log('--영업 끝났습니다--');
}
)
// "Error: err..실패.. 다시 주문해주세요"
// "--영업 끝났습니다--"
catch : reject인 경우에만 실행됨
finally : 성공, 실패 여부와 관계없이 처리가 완료되면 항상 실행됨
실습 1
const pr = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('OK'); // (1)
// reject('err..') // (2)
}, 1000);
});
console.log('시작');
pr.then((res) => {
console.log(res);
}).catch((err) => {
console.log(err);
}).finally(() => {
setTimeout(() => {
console.log('끝')
}, 1000);
});
(1)
"시작"
"OK" // 1초 후
"끝" // 1초 후
(2)
"시작"
"err.." // 1초 후
"끝" // 1초 후
실습 2 (여러 비동기 작업을 연속적으로 수행하는 방법)
const f1 = function(callback){
setTimeout(function(){
console.log('1번 주문 완료');
callback();
}, 1000);
}
const f2 = (callback) => {
setTimeout(function(){
console.log('2번 주문 완료');
callback();
}, 3000);
};
const f3 = (callback) => {
setTimeout(function(){
console.log('3번 주문 완료');
callback();
}, 2000);
};
console.log('시작');
// 1번주문 후, 2번주문 후, 3번주문 할 것
// f1은 callback함수를 받기 때문에, f1 안에서 함수를 실행해줘야 한다.
// 우리는 f1이 끝난 후 f2를 실행할 것이기 때문에, f1의 함수 내 f2를 실행해줘야 함. (f2 -> f3도 동일)
f1(function(){
f2(function(){
f3(function(){
console.log('끝')
});
});
});
// "시작"
// (1초 후) "1번 주문 완료"
// (3초 후) "2번 주문 완료"
// (2초 후) "3번 주문 완료"
// "끝"
const f1 = () => {
const apiResult = {
score: 99,
rating: 1,
};
return new Promise((res, rej) => {
setTimeout(() => {
// setTimeout()을 사용해 비동기 코드를 흉내낸 것.
// 실제로는 여기서 XHR이나 HTML5 API를 사용할 것임
res(apiResult);
// api등 요청에 성공하면 받아와지는 결과값을 전달
}, 1000);
});
};
const f2 = (msg) => {
console.log(msg);
return new Promise((res, rej) => {
setTimeout(() => {
res('2번 요청 완료');
// rej('xxx 2번 요청 실패 xxx');
}, 3000);
});
};
const f3 = (msg) => {
console.log(msg);
return new Promise((res, rej) => {
setTimeout(() => {
res('3번 요청 완료');
}, 2000);
});
};
console.log('시작');
f1().then(res => f2(res))
.then(res => f3(res))
.then(res => console.log(res))
.catch(err => console.log(err))
.finally(() => {
console.log("--요청 끝--");
})
// 시작
// (1초 후) {score: 99, rating: 1}
// (3초 후) 2번 요청 완료
// (2초 후) 3번 요청 완료
// "--요청 끝--"
// --- f2 가 실패한 경우 ---
// (1초 후) {score: 99, rating: 1}
// (3초 후) "xxx 2번 요청 실패 xxx"
// "--요청 끝--"
: 모든 주문을 동시에 실행하여, 모든 프로미스 값 or 거절된 프로미스 값 반환
const f1 = () => {
const apiResult = {
score: 99,
rating: 1,
};
return new Promise((res, rej) => {
setTimeout(() => {
res(apiResult);
}, 1000);
});
};
const f2 = (msg) => {
console.log(msg);
return new Promise((res, rej) => {
setTimeout(() => {
// res('2번 요청 완료');
rej('xxx 2번 요청 실패 xxx');
}, 3000);
});
};
const f3 = (msg) => {
console.log(msg);
return new Promise((res, rej) => {
setTimeout(() => {
res('3번 요청 완료');
}, 2000);
});
};
Promise.all([f1(), f2(), f3()])
.then(res => {
console.log(res)
})
// [{…}, '2번 요청 완료', '3번 요청 완료']
/*
0: {score: 99, rating: 1}
1: "2번 요청 완료"
2: "3번 요청 완료"
*/
const f2 = (msg) => {
console.log(msg);
return new Promise((res, rej) => {
setTimeout(() => {
// res('2번 요청 완료');
rej('xxx 2번 요청 실패 xxx');
}, 3000);
});
};
Promise.all([f1(), f2(), f3()])
.then(res => {
console.log(res)
})
.catch(err => {
console.log(err)
})
// xxx 2번 요청 실패 xxx
Uncaught (in promise) xxx 2번 요청 실패 xxx
: 주어진 모든 프로미스 중 가장 먼저 완료되는 프로미스 값 반환
const f1 = () => {
const apiResult = {
score: 99,
rating: 1,
};
return new Promise((res, rej) => {
setTimeout(() => {
res(apiResult);
}, 1000);
});
};
const f2 = (msg) => {
console.log(msg);
return new Promise((res, rej) => {
setTimeout(() => {
// res('2번 요청 완료');
rej('xxx 2번 요청 실패 xxx');
}, 500);
});
};
const f3 = (msg) => {
console.log(msg);
return new Promise((res, rej) => {
setTimeout(() => {
res('3번 요청 완료');
}, 2000);
});
};
Promise.race([f1(), f2(), f3()])
.then(res => {
console.log(res)
})
// {score: 99, rating: 1}