[ ๋น๋๊ธฐ ๊ด๋ จ ํฌ์คํ ] https://velog.io/@bommy5799/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%B9%84%EB%8F%99%EA%B8%B0-Asynchronous
Promise๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํ ๊ฐ์ฒด
์ฝ๋ฐฑ ์ง์ฅ์์ ๋ฒ์ด๋๊ธฐ ์ํด ํ๋ก๋ฏธ์ค ํจํด ์ฌ์ฉ
โ
ํ๋ก๋ฏธ์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๋น๋๊ธฐ ๋ฉ์๋์์ ๋ง์น ๋๊ธฐ ๋ฉ์๋์ฒ๋ผ ๊ฐ์ ๋ฐํํ ์ ์๋ค.
(์ต์ข
๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ๊ฒ์ด ์๋๊ณ , ๋ฏธ๋์ ์ด๋ค ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ๊ฒ ๋ค๋ '์ฝ์'(ํ๋ก๋ฏธ์ค)์ ๋ฐํํ๋ค.)
โ
์ฝ๋ฐฑ ํจ์์ ์ฌ์ฉ์ ์ ์ฉํ์ง๋ง ์ฝ๋ฐฑ ํจ์์ ์ฆ์ ์ฌ์ฉ์ผ๋ก ์ธํด ์ฝ๋๊ฐ
๋ฐ๋ฆฌ๋ ํํ์ callback HELL
ํ์์ด ๋ฐ์ํ๋ค.
โ ์ด๋ฌํ ์ด์ ๋ก ES6์์๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ ๋ค๋ฅธ ํจํด์ผ๋ก ํ๋ก๋ฏธ์ค(Promise)๋ฅผ ๋์ ํ๋ค
Promise Hell
์ด ๋ฐ์ํ๋ค. Promise๋ ๋ค์ ์ธ ๊ฐ์ง์ ์ํ๋ฅผ ๊ฐ๋๋ค. ์๋ ์๋ฆฌ๋ฅผ ๋ณด๋ฉด์ ์ดํดํ๋ฉด ์ฝ๋ค.
๋๊ธฐ(pending)
: ์ดํํ์ง๋, ๊ฑฐ๋ถํ์ง๋ ์์ ์ด๊ธฐ ์ํ.์ดํ(fulfilled)
: ์ฐ์ฐ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋จ.๊ฑฐ๋ถ(rejected)
: ์ฐ์ฐ์ด ์คํจํจ.Promise
๋ ํด๋์ค์ฒ๋ผ new ํค์๋
๋ก ์์ฑ์๋ฅผ ๋ง๋ ๋ค. let a = new Promise((resolve,reject) => {});
console.log(a)
>
//Promise {<pending>}
// [[Prototype]]: Promise
// [[PromiseState]]: "Pending" //Promise์
// [[PromiseResult]]: undefined
Promise ๊ฐ์ฒด์ ๋งค๊ฐ๋ณ์๋ก ์๋ฐ์คํฌ๋ฆฝํธ์์ ์์ฒด ์ ๊ณตํ๋ ์ฝ๋ฐฑํจ์
(resolve
์ reject
)๋ฅผ ์ค ์ ์๋ค.
(๊ผญ resolve, reject ์ด๋ฆ์ ์์ฑํด์ผ ํ๋ ๊ฒ์ ์๋๋ฉฐ, reslove์ reject ์์๋ง ๋ง๊ฒ ๋์์์ผ์ฃผ๋ฉด ๋๋ค.)
๋น๋๊ธฐ ์์
์คํ์ ์ฒ๋ฆฌ ์ฑ๊ณต ์ฌ๋ถ์ ๋ฐ๋ผ ์ฑ๊ณต์ resolve()
๋ฐํ, ์คํจ์ reject()
๋ฅผ ๋ฐํํ๋ค.
โ๏ธ( resolve์ reject๋ Promise๋ฅผ ํธ์ถํ ๊ฒ์ด ์๋ ์ฆ์ ์คํ์ ํด๋นํ๋ค. )
Promise๊ฐ resolve ๋๋ reject๋ฅผ ๊ฑฐ์น ์ํ๋ "fulfilled" ํน์ "rejected"
resolve
let a = new Promise((resolve,reject) =>{
resolve('hello')
});
console.log(a)
//Promise {<fulfilled>: 'hello'}
// [[Prototype]]: Promise
// [[PromiseState]]: "fulfilled" //์ดํ ์ํ
// [[PromiseResult]]: hello
reject
let b = new Promise((resolve,reject) =>{
reject('bye')
});
console.log(b)
//Promise {<rejected>: 'bye'}
// [[Prototype]]: Promise
// [[PromiseState]]: "rejected" //๊ฑฐ๋ถ ์ํ
// [[PromiseResult]]: bye
then()
, catch()
๋ก ํ๋ก๋ฏธ์ค๋ฅผ ์ฆ์ ๋ฐํํ ์ ์๋ค.
then(callback)
then()
์ ๋ํ ๊ฒฐ๊ณผ๋กPromise๋ฅผ ๋ฐํ
ํ๋ค.- resolve( ) ๋ฐํ ์ดํ์ ์คํ ์ํฌ ํจ์๋ฅผ ์์ฑ
- ์ธ์๋ก ์ฒ๋ฆฌํ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ค๋ค.
catch(callback)
then()
์ ๋ํ ๊ฒฐ๊ณผ๋กPromise
๋ฅผ ๋ฐํํ๋ค.- reject( ) ๋ฐํ ํ ์คํ ์ํฌ ํจ์๋ฅผ ์์ฑ
- ์ธ์๋ก ์ฒ๋ฆฌํ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ค๋ค.
then
๊ณผ catch
๋ ํ๋ก๋ฏธ์ค
๋ฅผ ๋ฐํ
ํ๋ค. then()
, catch()
๋ ๋ฐํ ์ดํ ์ฒ๋ฆฌํ ์ฝ๋ฐฑ ํจ์
๋ฅผ ์ธ์
๋ก ๋ฐ๋๋ค.Promise๋ฅผ ํตํด then์ผ๋ก ์ฐ๊ฒฐํ ๊ฒ์ด
์ฒด์ธ์ ํํ
๋ฅผ ๋๋ค๊ณ ํด์ ์๊ฒจ๋ ์ฉ์ด์ด๋ค.
printString("A")
๊ฐ resolveํตํด promise๋ฅผ ๋ฐํํ๋ฉด,
๊ทธ ์๋ .then(() => {return printString("B")})
๊ตฌ๋ฌธ์ผ๋ก ๋์ด๊ฐ๋ค.
const printString = (string) => {
//Promise๋ฅผ ์์ฑํ์ฌ ๋งค๊ฐ ๋ณ์๋ก resolve, reject๋ฅผ ์ค๋ค.
return new Promise((resolve,reject) => {
setTimeout(
() => {
console.log(string)
resolve()
},
Math.floor(Math.random() * 100)+1
)
})
}
const printAll = () => {
printString("A") //string๋ง ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ
.then(() => { //then()์ผ๋ก ์ฒซ task๊ฐ ๋๋ ํ ๋ค์ task๋ฅผ ์งํํ ์ ์๊ฒ ํด์ค๋ค.
return printString("B")
})
.then(() => {
return printString("C")
})
}
printAll()
Promise.all์ ์ฌ๋ฌ๊ฐ์ ํ๋ก๋ฏธ์ค๋ฅผ ํ๋๋ก ๋ฌถ์ด์ ํ๋์ ํ๋ก๋ฏธ์ค ์ฒ๋ผ ์ํํ ์ ์๋ค.
์๋์ ๊ฐ์ด ๋งค๊ฐ๋ณ์ ๋ฐฐ์ด์ ์ธ์๋ก ๋๋ ์ ์ ๋ฌํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ฉฐ,
๋งค๊ฐ๋ณ์๋ฅผ ์ฒ๋ฆฌํด์ฃผ๋ then ์ ์ฝ๋ฐฑ ํจ์ ๋ด๋ถ์์๋ ๋ฐฐ์ด์ ์ธ๋ฑ์ค ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
โ
ํ๋ก๋ฏธ์ค ํจํด๋ณด๋ค ๋ ๊น๋ํ ์ฝ๋ ์์ฑ์ ์ํด ES7์์ ์๋ก์ด ๋ฌธ๋ฒ <async/await
> ์ด ๋์
๋์๋ค.
async
ํค์๋๋ฅผ ๋ช
์ํจ์ผ๋ก์จ ๋น๋๊ธฐ ํจ์์ ์ฌ์ฉ์ ์ ์ธ
ํ ์ ์๋ค.Promise๋ฅผ ๋ฐ์ ์ฒ๋ฆฌํ๋ ํค์๋
>๋ผ๋ ์๋ฏธ์ด๋ค.await
ํค์๋๋ฅผ ์์ฑ async function(){
await ํจ์()
}
async ํจ์ ๋ด๋ถ
์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. (๋ฐ๋์ async ํจ์์ ์ง์ ๋ด๋ถ์์๋ง ์ฐ์ฌ์ผํ๋ค)
async ํจ์์ ์คํ์ ์ผ์ ์ค์งํ๊ณ ์ ๋ฌ ๋ Promise์ ํด๊ฒฐ์ ๊ธฐ๋ค๋ฆฐ ๋ค์ async ํจ์์ ์คํ์ ๋ค์ ์์ํ๊ณ ์๋ฃํ ๊ฐ์ ๋ฐํํ๋ค.
์ฝ๋ ์ฝ๊ธฐ๊ฐ ์์ํ๋ค.
await ํค์๋๋ ์ผ๋ฐ ๋น๋๊ธฐ ์ฒ๋ฆฌ์ฒ๋ผ ๋ฐ๋ก ์คํ์ด ๋ค์ ๋ผ์ธ์ผ๋ก ๋์ด๊ฐ๋ ๊ฒ์ด ์๋๋ผ ๊ฒฐ๊ณผ๊ฐ์ ์ป์ ์ ์์ ๋๊น์ง ๊ธฐ๋ค๋ ค์ฃผ๊ธฐ ๋๋ฌธ์ await ์ดํ์ ์ฝ๋๋ค๋ ์ผ๋ฐ ๋๊ธฐ ์ฒ๋ฆฌ ์ฝ๋๋ค์ฒ๋ผ ์ญ ์ฝ์ด๋๊ฐ๋ฉด ๋๋ค.
try catch
๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ค.try {
nonExistentFunction();
} catch (error) {
console.error(error);
// expected output: ReferenceError: nonExistentFunction is not defined
// Note - error messages will vary depending on browser
}
// ํจ์ ๋ถ๋ถ์ ๋์ผํ๊ฒ ์์ฑ
const printString = (string) => {
//Promise๋ฅผ ์์ฑํ์ฌ ๋งค๊ฐ ๋ณ์๋ก resolve, reject๋ฅผ ์ค๋ค.
return new Promise((resolve,reject) => {
setTimeout(
() => {
console.log(string)
resolve()
},
Math.floor(Math.random() * 100)+1
)
})
}
// ์คํ ์ํฌ ํจ์์ async ํค์๋ ์์ฑ
//returnํ ํจ์ ๋ช
์ await ํค์๋
const printAll = async () => {
await printString("A")
await printString("B")
await printString("C")
}
printAll();