* ํ๋ก๋ฏธ์ค(Promise):
- new Promise๋ก ์์ฑ, ํจ์๋ฅผ ์ ๋ฌ๋ฐ๋๋ฐ ์ฌ๊ธฐ์ ์ธ์๋ resolve์ reject์ ํด๋น.
resolve๋ ์ฑ๊ณตํ ๊ฒฝ์ฐ, reject๋ ์คํจํ์ ๋ ๋ํ๋๋ ํจ์. => ์ด๋ ๊ฒ ์ด๋ค ์ผ์ด ์๋ฃ๋์ด ์คํ๋๋ ํจ์๋ฅผ '์ฝ๋ฐฑ(callback)ํจ์'๋ผ๊ณ ํจ.
-new Promise ์์ฑ์๊ฐ ๋ฐํํ๋ ํ๋ก๋ฏธ์ค ๊ฐ์ฒด๋ state์ result๋ฅผ ํ๋กํผํฐ๋ก ๋ฐ์
state : pending(๋๊ธฐ) / result: undefined
state๋ ์ด๊ธฐ์ pending์ด์๋ค๊ฐ resolve(value)๋ก ํธ์ถ( ์ฆ, ์ฑ๊ณตํ๋ฉด)๋๋ฉด
state: fulfilled(์ดํ๋จ) / result: value ๊ฐ ๋จ. (์ด๋์ result๋ resolve ํจ์์์ ์ ๋ฌ๋ ๊ฐ.)
๋ง์ฝ reject(error)๊ฐ ํธ์ถ(์ฆ, ์คํจํ๋ฉด)๋๋ฉด
state: rejected(๊ฑฐ๋ถ๋จ) / result: error ๊ฐ ๋จ. (์ด๋์ result๋ rejectํจ์์์ ์ ๋ฌ๋ ์๋ฌ.)
const pr = new Promise((resolve, reject) => {
//code
});
์์1) ํ๋งค์๊ฐ ์ฃผ๋ฌธ์ ํ๋ฉด 3s ํ๋ ํ ์ฑ๊ณต or ์คํจ ์๋ ค์ค
ํ๋งค์์ ์ฝ๋ - resolve์ ๊ฒฝ์ฐ
- state: pending -> 3์ด ํ-> fulfilled
- result: undefined -> 3s-> 'OK'
const pr = new Promise((resolve, reject) => {
setTimeout(()=>{
resolve('OK')
},3000)
});
ํ๋งค์์ ์ฝ๋ - reject์ ๊ฒฝ์ฐ
- state: pending -> 3s -> rejected(๊ฑฐ๋ถ๋จ)
- result: undefined -> 3s -> error
const pr = new Promise((resolve, reject) => {
setTimeout(()=>{
reject(new Error('error,,'))
},3000)
});
*pr.then: then์ ์ด์ฉํ์ฌ resolve์ reject ์ฒ๋ฆฌ ๊ฐ๋ฅ
- function(result){} : ์ดํ ๋์์ ๋ ์คํํ๋ ํจ์๋ก OK ๊ฐ์ด ๋ค์ด์ด
- function(err){}: ๊ฑฐ๋ถ ๋์์ ๋ ์คํํ๋ ํจ์๋ก err ๊ฐ์ด ๋ค์ด์ด
const pr = new Promise((resolve, reject) => {
setTimeout(()=>{
resolve('OK')
},3000)
});
pr.then(
function(result){},
function(err){}
);
์์2) ์๋น์์ ์ฝ๋
- ์ฌ๊ธฐ์๋ resolve๋ก ์คํ๋์๊ธฐ ๋๋ฌธ์ ์ด ์ํฉ์์๋ ๋๋ฒ์งธ ์ฝ๋ฐฑํจ์๋ ์คํX
const pr = new Promise((resolve, reject) => {
setTimeout(()=>{
resolve('OK')
},3000)
});
pr.then(
function(result){
console.log(result + '๊ฐ์ง๋ฌ ๊ฐ๊ธฐ');
},
function(err){
console.log('๋ค์ ์ฃผ๋ฌธํ๊ธฐ');
}
);
โ then ์ด์ธ์ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ catch์ finally
- catch: ์๋ฌ ๋ฐ์ ์ reject์ธ ๊ฒฝ์ฐ ์คํ. ๋๋ฒ์งธ๋ก ์ ๋ฌํ๋ ํจ์๋ฅผ catch์ ๋ฃ์ด ๋์ผํ๊ฒ ๋์ํ๊ฒ ํจ. catch๋ก ๋ช ํํ๊ฒ ๊ตฌ๋ถํด ์ฃผ๋ ๊ฒ์ด ๊ฐ๋ ์ฑ์๋ ์ข๊ณ ์ฒซ๋ฒ์งธํจ์ ์คํํ๋ค๊ฐ ๋ฐ์ํ๋ ์๋ฌ๋ฅผ ์ก์์ค ์ ์๊ธฐ ๋๋ฌธ์ ์ด ์ง๋ฌธ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ๋ฆฌ
pr.then(
function(result){}
).catch(
function(err){}
)
- finally: ํจ์ ์ดํํ๊ฑฐ๋ ๊ฑฐ๋ถํ๊ฑฐ๋ ์๊ด์์ด ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋๋ฉด ํญ์ ์คํ. ๋ก๋ฉํ๋ฉด ์์จ ์ ์ ์ฉํ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅ
pr.then(
function(result){}
).catch(
function(err){}
).finally(
function(){
console.log('์ฃผ๋ฌธ์๋ฃ')
}
)
์์)
- resolve
const pr = new Promise((resolve, reject) => {
setTimeout(()=>{
resolve('OK')
},3000)
});
console.log("์์")
pr.then((result) => {
console.log(result);
})
.catch((err)=>{
console.log(err);
})
.finally(()=>{
console.log("๋");
});
// ์์ -> OK -> ๋
- reject
const pr = new Promise((resolve, reject) => {
setTimeout(()=>{
reject(new Error("err,,XD"))
},3000)
});
console.log("์์")
pr.then((result) => {
console.log(result);
})
.catch((err)=>{
console.log(err);
})
.finally(()=>{
console.log("๋");
});
//์์ -> Error: err,,XD -> ๋
=> ์ดํ, ๊ฑฐ๋ถ ์๊ด์์ด ๋ง๋ฌด๋ฆฌ๋ ํญ์ ๋์ด ๋์ด
์์) ์ฝ๋ฐฑํจ์ ์ฌ์ฉํด์ ๋ง๋ค ๊ฒฝ์ฐ
const f1 = (callback) => {
setTimeout(function(){
console.log("1๋ฒ ์ฃผ๋ฌธ ์๋ฃ");
callback();
},1000);
};
const f2 = (callback) => {
setTimeout(function(){
console.log("2๋ฒ ์ฃผ๋ฌธ ์๋ฃ");
callback();
},2000);
};
const f3 = (callback) => {
setTimeout(function(){
console.log("3๋ฒ ์ฃผ๋ฌธ ์๋ฃ");
callback();
},3000);
};
console.log('์์')
f1(function(){
f2(function(){
f3(function(){
console.log('๋')
});
});
});
//์์ -> 1๋ฒ ์ฃผ๋ฌธ ์๋ฃ->2๋ฒ ์ฃผ๋ฌธ ์๋ฃ->3๋ฒ ์ฃผ๋ฌธ ์๋ฃ-> ๋
์์) ํ๋ก๋ฏธ์ค ์ฝ๋๋ก ๊ตฌํํ ๊ฒฝ์ฐ
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๋ฒ ์ฃผ๋ฌธ ์๋ฃ");
},2000);
});
};
const f3 = (message) =>{
console.log(message);
return new Promise((res,rej)=>{
setTimeout(()=>{
res("3๋ฒ ์ฃผ๋ฌธ ์๋ฃ");
},3000);
});
};
console.log('์์');
f1()
.then((res) => f2(res))
.then((res) => f3(res))
.then((res) => console.log(res))
.catch(console.log)
.finally(()=>{
console.log("๋")
});
//์์ -> 1๋ฒ ์ฃผ๋ฌธ ์๋ฃ->2๋ฒ ์ฃผ๋ฌธ ์๋ฃ->3๋ฒ ์ฃผ๋ฌธ ์๋ฃ-> ๋
=> ํ๋ก๋ฏธ์ค ์ฒด์ด๋(Promise chaining): ํ๋ก๋ฏธ์ค๋ผ๋ฆฌ ์ฐ๊ฒฐ
์์) ์ค๊ฐ์ ์คํจํ๋ ๊ฒฝ์ฐ
- 2๋ฒ์์ ์คํจ ๋์ด xxx๊ฐ ๋จ๊ณ ๋ฐ๋ก finally๋ก ๋๋จ
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");
},2000);
});
};
const f3 = (message) =>{
console.log(message);
return new Promise((res,rej)=>{
setTimeout(()=>{
res("3๋ฒ ์ฃผ๋ฌธ ์๋ฃ");
},3000);
});
};
console.log('์์');
f1()
.then((res) => f2(res))
.then((res) => f3(res))
.then((res) => console.log(res))
.catch(console.log)
.finally(()=>{
console.log("๋")
});
//์์ -> 1๋ฒ ์ฃผ๋ฌธ ์๋ฃ->xxx-> ๋
* Promise.all: ํ๊บผ๋ฒ์ ์์ํ๊ณ ๋ชจ๋ ์ดํ๋๋ฉด ๊ฐ์ ์ฌ์ฉํ ์ ์์ด ์๊ฐ ์ ์ฝํ ์ ์์. ๊ฐ ํ๋ก๋ฏธ์ค๋ก ๋๊ฒจ์ค ๊ฐ์ ๋ฐฐ์ด๋ก ๋ฐ๋๋ฐ ์ฌ๊ธฐ์๋ 3 ์์ ์ด ๋ชจ๋ ์๋ฃ ๋์ด์ผ then ๋ถ๋ถ์ด ์คํ๋จ
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);
});
};
//Promise.all
Promise.all([f1(),f2(),f3()]).then((res)=>{
console.log(res);
})
//(3) ['1๋ฒ ์ฃผ๋ฌธ ์๋ฃ', '2๋ฒ ์ฃผ๋ฌธ ์๋ฃ', '3๋ฒ ์ฃผ๋ฌธ ์๋ฃ']
- timeEnd๋ฅผ ์ด์ฉํด ์ด ๊ฑธ๋ฆฐ ์๊ฐ์ ์์๋ผ ์ ์์.
console.time("x");
Promise.all([f1(),f2(),f3()]).then((res)=>{
console.log(res);
console.timeEnd("x")
})
//(3) ['1๋ฒ ์ฃผ๋ฌธ ์๋ฃ', '2๋ฒ ์ฃผ๋ฌธ ์๋ฃ', '3๋ฒ ์ฃผ๋ฌธ ์๋ฃ']
//x: 3077.184814453125 ms
โ reject๋ก ์คํํ ๊ฒฝ์ฐ: ์๋ฌ ๋ฐ์ํ๊ณ ์ด๋ ํ ๊ฐ๋ ์ป์ง ๋ชปํจ. ํ๋ก๋ฏธ์ค ์ฌ์ ํ๋์ ์ ๋ณด๋ผ๋ ๋๋ฝ๋๋ฉด ํ์ด์ง๋ฅผ ๋ณด์ฌ์ค ์ ์๋ ๊ฒฝ์ฐ ์ฌ์ฉ๋จ(๋ค ๋ณด์ฌ์ฃผ๊ฑฐ๋ ์ ๋ณด์ฌ์ฃผ๊ฑฐ๋ ํ ๋)
const f1 = () =>{
return new Promise((res,rej)=>{
setTimeout(()=>{
// res("1๋ฒ ์ฃผ๋ฌธ ์๋ฃ");
rej(new Error("xxx"));
},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);
});
};
//Promise.all
console.time("x");
Promise.all([f1(),f2(),f3()]).then((res)=>{
console.log(res);
console.timeEnd("x")
})
// ์๋ฌ ๋ฐ์
*Promise.race: ์ฌ์ฉ๋ฐฉ๋ฒ์ promise.all๊ณผ ๋์ผ. promise.all์ ๋ชจ๋ ์์ ์ด ์๋ฃ๋ ๋ ๊น์ง ๊ธฐ๋ค๋ฆฌ์ง๋ง race๋ ๋ง ๊ทธ๋๋ก ๊ฒฝ์ฃผ๋ผ์ ํ๋๋ผ๋ ๋จผ์ ์๋ฃ๋๋ฉด ์์ ์ ๋๋. ์ฉ๋์ด ํฐ ์ด๋ฏธ์ง๋ค์ ๋ก๋ฉํ๋๋ฐ ๊ทธ ์ค ํ๋๋ผ๋ ์๋ฃ๋๋ฉด ๊ทธ ์ด๋ฏธ์ง๋ฅผ ๋ณด์ฌ์ค ๋ ์ฌ์ฉ.
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๋ฒ ์ฃผ๋ฌธ ์๋ฃ");
rej(new Error("xxx"));
},3000);
});
};
const f3 = (message) =>{
console.log(message);
return new Promise((res,rej)=>{
setTimeout(()=>{
res("3๋ฒ ์ฃผ๋ฌธ ์๋ฃ");
},2000);
});
};
//Promise.race
console.time("x");
Promise.race([f1(),f2(),f3()]).then((res)=>{
console.log(res);
console.timeEnd("x")
})
// 1๋ฒ ์ฃผ๋ฌธ ์๋ฃ
// x: 1058.05078125 ms
'js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
javascript Generator (0) | 2022.11.02 |
---|---|
javascript async, await (0) | 2022.11.01 |
javascript ํด๋์ค(class) (0) | 2022.11.01 |
javascript ์์, ํ๋กํ ํ์ (Prototype) (0) | 2022.10.31 |
javascript ๋ฉ์๋ call, apply, bind (0) | 2022.10.31 |