๐ก ๊ทธ๋์ async/await, Promise๋ฅผ ์์์ด ์จ์์ง๋ง ์ ์ฐ๋์ง, ์ด๋ค ๋ฐฉ์์ผ๋ก ์๋ํ๋์ง ์ ๋ชฐ๋๋ ๊ฒ ๊ฐ๋ค. แ( ๏ธก’๏ธก ็ ’๏ธ )เธโฌโฌโ ๊ทธ๋์ ์ด๋ฒ ๊ธฐํ์ ๋ค์ ๊ณต๋ถํ๊ณ ๊ณต๋ถํ ๊ฒ์ ๊ธฐ๋กํด๋ณด๋ ค๊ณ ํ๋ค.
๋๊ธฐ vs ๋น๋๊ธฐ
๋๋ ์์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด์ ์ด๋์ ๋ ์ดํด๊ฐ ๋๋ค.
- ๋๊ธฐ : ์์ ์์ ์ ์๋ต์ ๊ธฐ๋ค๋ฆฐ ๋ค ๋ค์ ์์ ์ ์ํํ๋ค.
- ๋น๋๊ธฐ : ์์ ์์ ์ ์๋ต์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋นจ๋ฆฌ ์ํํ๋ ์์ ๋ถํฐ ์๋ฃ๋๋ค.
๋ณดํต ๋๊ธฐ๋ ์ํ, ๋น๋๊ธฐ๋ ์นดํ๋ก ์๋ฅผ ๋ง์ด ๋ค๋๋ฐ, ๋๋ ๋ค๋ฅธ ์๊ฐ ์๊ฐ์ด ๋์ง ์์ ํด๋น ์๋ฅผ ๊ธฐ๋กํด๋๊ฒ ๋ค.
๋๊ธฐ์ ๋ฐฉ์
์ํ์ ๊ฐ๋ฉด ์๋ฒํ๋ฅผ ๋ฝ๊ณ , ์ด์ ๋๊ธฐ์์ ์์ ์ด ๋ชจ๋ ๋๋์ผ ๋ด ์ฐจ๋ก๊ฐ ๋์์จ๋ค. ์์ฝ์์คํ ์ด๋๊ฑด ์๊ธฐ ๋๋ฌธ์ ๋ด ์์ ๊ฐ์๊ธฐ ๋ค๋ฅธ ์ด๋ฒคํธ๊ฐ ์๊ธธ ์๋ ์๊ณ , ๋์ ๋์์ ๋ค๋ฅธ ์ฌ๋์ ์ ๋ฌด๋ฅผ ๋ด์ฃผ์ง๋ ์๋๋ค.
๋ค์ ์ด๋ฒคํธ๋ฅผ ๋์ํ๋ ์คํ ์์๊ฐ ํ์คํ ๊ฒ์ ๋๊ธฐ์ ๋ฐฉ์์ด๋ผ ๋ถ๋ฅธ๋ค.
๋น๋๊ธฐ์ ๋ฐฉ์
์๋ฉ๋ฆฌ์นด๋ ธ ๋จ์ฒด์๋ 30๋ช ๊ณผ ์๋ฉ๋ฆฌ์นด๋ ธ ํ ์์ฉ ๋ ๋๊ธฐ์๊ฐ ์๋๋ค๊ณ ํ์ ๋, ์นดํ ์ง์์ ‘์์ ์ฃผ๋ฌธ์ด ๋ฐ๋ ค์ ์ฃ์กํฉ๋๋ค' ๋ผ๊ณ ๋งํ๊ฒ ์ง๋ง ์ด์จ๋ ๋จ์ฒด์๋ 30๋ช ๋ณด๋ค ๋ด๊ฐ ์ํจ ์๋ฉ๋ฆฌ์นด๋ ธ ํ ์์ด ๋ ๋นจ๋ฆฌ ๋์ฌ ๊ฒ์ด๋ค.
์ฐ์์ ์ผ๋ก ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ฅผ ๋ด์ ํ ์๋ฃ๋๋ ์์๋๋ก ์ผ์ ์ฒ๋ฆฌํ๋ ์คํ ์์๊ฐ ํ์คํ์ง ์์ ๊ฒ์ ๋น๋๊ธฐ์ ๋ฐฉ์์ด๋ผ ํ๋ค.
๋น๋๊ธฐ์ ๋ฐฉ์์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ๋ค
๋น๋๊ธฐ์ ๋ฐฉ์์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ฝ๋ฐฑ ํจ์ ์ฌ์ฉ, Promise, async/await๊ฐ ์๋ค๊ณ ํ๋๋ฐ, ์ฝ๋ฐฑ ํจ์ ์ฌ์ฉ์ ์ด๋ฒ ํฌ์คํ ์ ์ฃผ์ ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ๋์ด๊ฐ๋๋ก ํ๊ฒ ๋ค.
Promise
๐ก ๋๋ ์๊ฐ๋ณด๋ค Promise๋ฅผ ๋ง์ด ์จ๋ณด์ง๋ ์์๋ค. ๊ทธ๋์ then์ด๋ผ๋์ง ์ฒด์ด๋์ด๋ผ๋์ง ์ฝ๊ฐ์ ์์ํ์ผ๋ ์ด๋ฒ ์คํฐ๋๋ก ์กฐ๊ธ์ ์๊ฒ ๋ ๊ฒ ๊ฐ๋ค.
- ์๋๋ Promise ์์ ์ด๋ค
let num = 1;
let promise1 = new Promise((resolve, reject) => {
if(num === 1){
resolve('success');
}else{
reject('fail');
}
});
promise1.then(data => {
console.log(data);
}).catch(error => {
console.log(error);
}).then(data => {
console.log('something new!');
});
์์ฒ๋ผ catch ๋ค์ ๋ ์ฒด์ด๋์ด ๋๊ธฐ๋ ํ๋ค๊ณ ํ๋ค.
- ์์ ์์ฒ๋ผ resolve ์ ๊ฐ์ then ์ผ๋ก ๋์ด๊ฐ๊ณ , reject ์ catch ๋ก ๋์ด๊ฐ๋ค.
- ๋๋ then ์ catch ๋ค์ ๋ค์ then ์ ์ฒด์ด๋ ํ์ผ๋ฏ๋ก reject ์ catch ๊ฐ ์คํ๋๊ณ , ๊ทธ ๋ค์ ๋ง์ง๋ง then ๋ ์คํ๋๋ค.
- Promise๋ ๋ค์ ์ค ํ๋์ ์ํ๋ฅผ ๊ฐ์ง๋ค.
- ๋๊ธฐ(pending): ์ดํํ์ง๋, ๊ฑฐ๋ถํ์ง๋ ์์ ์ด๊ธฐ ์ํ
- ์ดํ(fulfilled): ์ฐ์ฐ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋จ
- ๊ฑฐ๋ถ(rejected): ์ฐ์ฐ์ด ์คํจํจ
๋ค์์ Promise์ ์ ์ ๋ฉ์๋๋ฅผ ๊ฐ๋จํ MDN์ ์ค๋ช ๊ณผ ๊ฐ๋จํ ์์ ์ ํจ๊ป ์ดํด๋ณด๊ฒ ๋ค.
Promise.all(iterable)
๐ก ์ฃผ์ด์ง ๋ชจ๋ ํ๋ก๋ฏธ์ค๊ฐ ์ดํํ๊ฑฐ๋, ํ ํ๋ก๋ฏธ์ค๊ฐ ๊ฑฐ๋ถ๋ ๋๊น์ง ๋๊ธฐํ๋ ์๋ก์ด ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํฉ๋๋ค. ๋ฐํํ๋ ํ๋ก๋ฏธ์ค๊ฐ ์ดํํ๋ค๋ฉด, ๋งค๊ฐ๋ณ์๋ก ์ ๊ณตํ ํ๋ก๋ฏธ์ค ๊ฐ๊ฐ์ ์ดํ ๊ฐ์ ๋ชจ๋ ๋ชจ์๋์ ๋ฐฐ์ด๋ก ์ดํํฉ๋๋ค. ๋ฐฐ์ด ์์์ ์์๋ ๋งค๊ฐ๋ณ์์ ์ง์ ํ ํ๋ก๋ฏธ์ค์ ์์๋ฅผ ์ ์งํฉ๋๋ค. ๋ฐํํ๋ ํ๋ก๋ฏธ์ค๊ฐ ๊ฑฐ๋ถ๋๋ค๋ฉด, ๋งค๊ฐ๋ณ์์ ํ๋ก๋ฏธ์ค ์ค ๊ฑฐ๋ถ๋ ์ฒซ ํ๋ก๋ฏธ์ค์ ์ฌ์ ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํฉ๋๋ค.
let num = 5;
let promise1 = Promise.resolve(3);
let promise2 = 42;
let promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo');
});
let promise4 = async (num)=>{
return num;
}
Promise.all([promise1, promise2, promise3, promise4(num)]).then((values) => {
console.log(values)
})
// [3, 42, 'foo', 5]
- Promise.all ์ ํจ์๋ ๋ฃ์ ์ ์์๋ค! ๋ฐฐ์ด ํํ๋ผ๋ฉด ๋ค ๋ค์ด๊ฐ ์ ์๊ตฌ๋.
Promise.allSettled
๐ก ์ฃผ์ด์ง ๋ชจ๋ ํ๋ก๋ฏธ์ค๊ฐ ์ฒ๋ฆฌ(์ดํ ๋๋ ๊ฑฐ๋ถ)๋ ๋๊น์ง ๋๊ธฐํ๋ ์๋ก์ด ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํฉ๋๋ค.Promise.allSettled() ๊ฐ ๋ฐํํ๋ ํ๋ก๋ฏธ์ค๋ ๋งค๊ฐ๋ณ์๋ก ์ ๊ณตํ ๋ชจ๋ ํ๋ก๋ฏธ์ค ๊ฐ๊ฐ์ ์ํ์ ๊ฐ(๋๋ ๊ฑฐ๋ถ ์ฌ์ )์ ๋ชจ์๋์ ๋ฐฐ์ด๋ก ์ดํํฉ๋๋ค.
let num = 5;
let promise1 = Promise.resolve(3);
let promise2 = new Promise((resolve, reject) =>
setTimeout(reject, 100, 'foo'));
let promise3 = async (num)=>{
return num;
}
let promises = [promise1, promise2, promise3(num)]
Promise.allSettled(promises)
.then((results) => results.forEach((result) => console.log(result.status)));
// fulfilled
// rejected
// fulfilled
// result๋ ๊ถ๊ธํด์ ์ฐ์ด๋ณด์์ต๋๋ค.
// { status: 'fulfilled', value: 3 }
// { status: 'rejected', reason: 'foo' }
// { status: 'fulfilled', value: 5 }
Promise.any(iterable)
๐ก ์ฃผ์ด์ง ๋ชจ๋ ํ๋ก๋ฏธ์ค ์ค ํ๋๋ผ๋ ์ดํํ๋ ์๊ฐ, ์ฆ์ ๊ทธ ํ๋ก๋ฏธ์ค์ ๊ฐ์ผ๋ก ์ดํํ๋ ์๋ก์ด ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํฉ๋๋ค.
let promise1 = Promise.reject(0)
let promise2 = new Promise((resolve) => setTimeout(resolve, 100, 'quick'));
let promise3 = new Promise((resolve) => setTimeout(resolve, 500, 'slow'));
const promises = [promise1, promise2, promise3]
Promise.any(promises).then((value) => console.log(value));
// "quick"
- ์ด ๊ธฐ๋ฅ์ node.js 15.0.0์์ ์ง์ํ์ผ๋ฏ๋ก 12๋ฅผ ์ฐ๋ ๋๋ ๋ด playground์์ ์คํํด๋ณผ ์ ์์๋ค..โ.โ MDN์์๋ ์ ์์ ์ผ๋ก ํ ์คํธ ๋๋ค.
Promise.race(iterable)
๐ก ์ฃผ์ด์ง ๋ชจ๋ ํ๋ก๋ฏธ์ค ์ค ํ๋๋ผ๋ ์ฒ๋ฆฌ๋ ๋๊น์ง ๋๊ธฐํ๋ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํฉ๋๋ค. ๋ฐํํ๋ ํ๋ก๋ฏธ์ค๊ฐ ์ดํํ๋ค๋ฉด, ๋งค๊ฐ๋ณ์์ ํ๋ก๋ฏธ์ค ์ค ์ฒซ ๋ฒ์งธ๋ก ์ดํํ ํ๋ก๋ฏธ์ค์ ๊ฐ์ผ๋ก ์ดํํฉ๋๋ค. ๋ฐํํ๋ ํ๋ก๋ฏธ์ค๊ฐ ๊ฑฐ๋ถ๋๋ค๋ฉด, ๋งค๊ฐ๋ณ์์ ํ๋ก๋ฏธ์ค ์ค ๊ฑฐ๋ถ๋ ์ฒซ ํ๋ก๋ฏธ์ค์ ์ฌ์ ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํฉ๋๋ค.
let promise1 = new Promise((resolve, reject) => {
setTimeout(resolve, 500, 'one');
});
let promise2 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'two');
});
let promise3 = new Promise((resolve, reject) => {
setTimeout(reject, 50, "three");
})
Promise.race([promise1, promise2, promise3]).then((value) => {
console.log(value);
// promise1๊ณผ promise2๊ฐ resolve ๋์ง๋ง promise3์ด ๋ ๋น ๋ฅด๋ค.
});
// "three"
- ์์ Promise.any ์ ๋ค๋ฅธ์ ์ด๋ผ๋ฉด ๊ฑฐ๋ถํ ํ๋ก๋ฏธ์ค์ ์ฌ์ ๋ ๊ทธ๋๋ก ์ฌ์ฉํ๋ค๋ ์ ์ด ์๊ฒ ๋ค.
async/await
async/await๋ Promise ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ Promise ๊ฐ์ฒด์์ ์ฌ์ฉํ๋ then ์ ์ฌ์ฉํ ์ ์๋ค.
let delay = (sec) => {
let promiseData = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(console.log(sec + "์ด์ ์คํ"));
}, sec * 1000);
});
return promiseData;
};
let funcAsync1 = async () => {
delay(5);
return "async1";
}
funcAsync1().then(result => {
console.log(result);
});
// await ์ผ์ ๋
let funcAsync2 = async () => {
await delay(2);
return "async2";
}
funcAsync2().then(result => {
console.log(result);
});
// async1
// 2์ด์ ์คํ
// async2
// 5์ด์ ์คํ
์์ธ์ฒ๋ฆฌ
async/await์ ๊ฒฝ์ฐ ์์ธ์ฒ๋ฆฌ๋ try/catch๋ฌธ์ ์ฌ์ฉํ๋ค.
let func = async () => {
try{
await delay(3);
}catch(e){
console.log(e);
}
};
๋ง์น๋ฉฐ…
๊ทธ๋์ ๋๋ฌด ์๋ ์ฝ๋๋ก๋ง ๊พธ์ญ๊พธ์ญ ์ฝ๋ฉํ๋ ๊ฒ ๊ฐ๋ค. ๋ด๊ฐ ์ง๊ณ ์๋ ์ฝ๋๊ฐ ์ด๋ค ์ฝ๋์ธ์ง ๊ถ๊ธํดํ ๋ง๋ ํ๋ฐ ๊ทธ๋ ์ง ์์๋ค๋ ๊ฒ์ด ์ค๋ง์ค๋ฝ๋ค. Promise.all ์ด๋ async/await ๋ง ์ฃผ๊ตฌ์ฅ์ฐฝ ์ผ์ง ๋ค๋ฅธ ๊ฑด ๊ด์ฌ๋ ์์๋ค.
์ด์ ๋ ์กฐ๊ธ ๋ ๊ด์ฌ์ ๊ฐ๊ณ ๊ณต๋ถํด์ ๋ ๋์ ์ฝ๋๋ฅผ ์งค ์ ์๊ฒ ๋ ธ๋ ฅํด์ผ๊ฒ ๋ค.
์ฐธ๊ณ ํ ์๋ฃ๋ค
https://studyingych.tistory.com/63
https://velog.io/@yejinh/๋น๋๊ธฐ-ํํค์น๊ธฐ
https://www.youtube.com/watch?v=pLiz2LdhYJM&list=PLjQHn5jzATkvggyE5oT7qU6FnmOv4ceY-&index=3
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Promise/race
'TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ปดํจํฐ๊ฐ ์๋ฅผ ํํํ๋ ๋ฐฉ๋ฒ (0) | 2023.01.04 |
---|---|
๋๋์ฒด TypeScript๊ฐ ๋ญ๊น? (0) | 2023.01.04 |
node ๋ฒ์ ์ ๋ฐ์ดํธ ํ๊ธฐ (0) | 2023.01.04 |
use strict๋? ์ ์ฐ๋๊ฑฐ์ผ? (2) | 2023.01.04 |
Serverless ๊ฐ๋ฐ ํ๊ฒฝ ์ ํ ํ๊ธฐ + iterm command not found error (0) | 2023.01.04 |