const pr = new Promise((resolve, reject) => {
(resolve: 성공했을 때 실행되는 함수, reject: 실패했을 때 실행되는 함수)
//code
});
→ 어떤 일이 완료된 이후 실행되는 함수: callback 함수
<new Promise>
state: pending(대기)
result: undefined
↓
resolve(value) ☞ state: fulfilled(이행됨)
result: value (resolve로 전달받은 값)
reject(error) ☞ state: rejected(거부됨)
result: error
ex)
const pr = new Promise((resolve, reject) => {
setTimeout(()=>{
resolve('OK')
}, 3000)
});
state: pending(대기) ☞ state: fulfilled(이행됨)
result: undefined (3s) result: 'OK'
const pr = new Promise((resolve, reject) => {
setTimeout(()=>{
reject(new Error('error..'))
}, 3000)
});
state: pending(대기) ☞ state: rejected(거부됨)
result: undefined (3s) result: error
→판매자의 코드: 주문을 받으면 3초 후에 성공인지 실패인지 알려줌.
소비자의 코드(then):
pr.then(
function(result){}, //이행되었을 때 실행, result = 'OK'
function(err){} //거부되었을 때 실행, err = 에러값
)
const pr = new Promise((resolve, reject) => {
setTimeout(()=>{
resolve('OK')
}, 3000)
});
pr.then(
function(result){
console.log(result + '가지러 가자.'); //"OK가지러 가자."
},
function(err){
console.log('다시 주문해주세요..');
}
);
거부되었을 때 = catch함수로 대체 가능
pr.then( pr.then(
function(result){}, → function(result){}
function(err){} ).catch(
); function(err){}
)
finally = 이행되었든, 거부되었든 실행
pr.then(
function(result){}
).catch(
function(err){}
).finally(
function(){
console.log('--- 주문 끝 ---')
}
)
const pr = new Promise((resolve, reject)=> {
setTimeout(()=> {
resolve("OK");
}, 1000);
});
console.log("시작");
pr.then((result) => {
console.log(result);
})
.catch((err) => {
console.log(err);
})
.finally(() => {
console.log("끝");
});
*Callback Hell
const f1 = (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('시작')
f1(function(){
f2(function(){
f3(function(){
console.log("끝");
});
});
});
*Promise Chain
const f1 = () => {
return new Promise((res, rej)=> {
setTimeout(() => {
res("1번 주문 완료");
}, 1000);
});
};
const f2 = (message) => {
console.log(message);
return new Promise((res, rej)=> {
setTimeout(() => {
res("2번 주문 완료");
}, 3000);
});
};
const f3 = (message) => {
console.log(message);
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(console.log)
.finally(() => {
console.log("끝");
});
const f1 = () => {
return new Promise((res, rej)=> {
setTimeout(() => {
res("1번 주문 완료");
}, 1000);
});
};
const f2 = (message) => {
console.log(message);
return new Promise((res, rej)=> {
setTimeout(() => {
rej("xxx");
}, 3000);
});
};
const f3 = (message) => {
console.log(message);
return new Promise((res, rej)=> {
setTimeout(() => {
res("3번 주문 완료");
}, 2000);
});
};
//Promise.all
console.time("x")
Promise.all([f1(), f2(), f3()]).then((res) => {
console.log(res);
console.timeEnd("x");
});
//Promise.race : 하나라도 완료되면 종료
console.time("x")
Promise.race([f1(), f2(), f3()]).then((res) => {
console.log(res);
console.timeEnd("x");
});
console.log("시작");
f1()
.then((res) => f2(res))
.then((res) => f3(res))
.then((res) => console.log(res))
.catch(console.log)
.finally(() => {
console.log("시작");
});
'Javascript' 카테고리의 다른 글
자바스크립트 중급 18 - Generator (0) | 2023.06.21 |
---|---|
자바스크립트 중급 17 - async, await (0) | 2023.06.21 |
자바스크립트 중급 15 - 클래스(Class) (0) | 2023.06.21 |
자바스크립트 중급 14 - 상속, 프로토타입(Prototype) (0) | 2023.06.16 |
자바스크립트 중급 13 - call, apply, bind (0) | 2023.06.14 |