์๋ฐ์คํฌ๋ฆฝํธ์์ ์ ๊ณตํ๋ ๋น๋๊ธฐ๋ฅผ ๊ฐํธํ๊ฒ ์ฒ๋ฆฌ ํ ์ ์๋๋ก ๋์์ฃผ๋ ๊ฐ์ฒด
- ์ ํด์ง ์ฅ์๊ฐ์ ๊ธฐ๋ฅ์ ์ํํ๊ณ ๋์ ์ ์์ ์ผ๋ก ๊ธฐ๋ฅ์ด ์ํ์ด ๋์ด์ง๋ฉด
์ฑ๊ณต์ ๋ฉ์ธ์ง์ ํจ๊ป ์ฒ๋ฆฌ๋ ๊ฒฐ๊ณผ ๊ฐ์ ์ ๋ฌ ํฉ๋๋ค. - ๋ง์ฝ, ๊ธฐ๋ฅ์ ์ํํ๋ค๊ฐ ์์์น ๋ชปํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด error ๋ฅผ ์ ๋ฌ ํฉ๋๋ค.
์ฌ์ฉํ๋ ์ด์
- ๋คํธ์ํฌ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๊ฑฐ๋ ํฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๋ ๊ณผ์ ์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋๋ฐ ๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ฉด
์์ ์ผ๋ค์ ์ฒ๋ฆฌํ๋ ๋์ ๋ค์ ๋ผ์ธ์ ์ฝ๋๊ฐ ์คํ๋์ง ์๊ธฐ ๋๋ฌธ์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ์ผ ๋ค์
promise ๋ฅผ ํตํด ๋น๋๊ธฐ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
promise ์ ์ํ
- promise๋ state์ result 2๊ฐ์ง ์จ๊น ํ๋กํผํฐ๋ฅผ ๊ฐ๊ณ ์์ต๋๋ค.
result๋ resolve(value)๊ฐ ํธ์ถ๋๋ฉด value๊ฐ ๋๋ฉฐ, reject(error)๊ฐ ํธ์ถ๋๋ฉด error๋ฅผ ๊ฐ๋๋ค.- pending : ํ๋ก๋ฏธ์ค๊ฐ ๋ง๋ค์ด์ ธ์ ์ฐ๋ฆฌ๊ฐ ์ง์ ํ ์คํผ๋ ์ด์ ์ด ์ํ ์ค์ผ ๋
- fulfilled : ์คํผ๋ ์ด์ ์ ์ฑ๊ณต์ ์ผ๋ก ๋๋ด๊ฒ ๋๋ฉด
- rejected : ํ์ผ์ ์ฐพ์ ์ ์๊ฑฐ๋ ๋คํธ์ํฌ์ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ฉด
promise ๊ณผ์
์์ํ๊ธฐ
- class ์ด๊ธฐ ๋๋ฌธ์ new ๋ผ๋ ํค์๋๋ฅผ ์ด์ฉํด์ ์ค๋ธ์ ํธ๋ฅผ ์์ฑ
- promise ๋ executor ๋ผ๋ ์ฝ๋ฐฑํจ์๋ฅผ ๋ฐ๊ณ ๊ทธ ์์๋ resolve, reject ๋ผ๋ ์ฝ๋ฐฑ ํจ์๊ฐ ์์ต๋๋ค.
- resolve : ๊ธฐ๋ฅ์ ์ ์์ ์ผ๋ก ์ํํด์ ๋ง์ง๋ง์ ์ต์ข ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๊ฒ
- reject : ๊ธฐ๋ฅ์ ์ํํ๋ค๊ฐ ์ค๊ฐ์ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ฉด ํธ์ถํ๊ฒ ๋๋ ๊ฒ
- ์ฃผ์์
- promise ๋ฅผ ๋ง๋๋ ์๊ฐ executor ๋ผ๋ ์ฝ๋ฐฑ ํจ์๊ฐ ๋ฐ๋ก ์คํ์ด ๋๊ธฐ ๋๋ฌธ์ ์ ์ํ๋ฉฐ ์ฌ์ฉ
const promise = new Promise((resolve, reject)=>{
// heavy work (network, read files)
console.log('doing someting...')
setTimeout(() => {
resolve('hyunho')
}, 2000)
})
์ฌ์ฉํ๊ธฐ
- then : ๊ฐ์ด ์ ์์ ์ผ๋ก ์ ์ํ์ด ๋๋ฉด[then] ์ด๋ค value ๋ฅผ ๋ฐ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ธฐ๋ฅ์ ์ํํ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ ๋ฌํด ์ฃผ๋ฉด ๋ฉ๋๋ค.
promise.then((value)=>{
console.log(value) // 2์ด ๋ค์ hyunho ์ถ๋ ฅ
})
// value ๋ promise ๊ฐ ์ ์์ ์ผ๋ก ์ ์ํ์ด ๋์ด์ ๋ง์ง๋ง์ผ๋ก resolve ์ฝ๋ฐฑํจ์์์ ์ ๋ฌ๋ 'hyunho'๋ผ๋ ๊ฐ์ด ๋ค์ด๊ฐ๋๋ค.
๋ง์ฝ reject ๋ฅผ ์์์ ์ฌ์ฉํ๋ฉด ?
const promise = new Promise((resolve, reject)=>{
// heavy work (network, read files)
console.log('doing someting...')
setTimeout(() => {
//resolve('hyunho')
reject(new Error('no network')) // Error ๋ JS์์ ์ ๊ณตํ๋ ์ค๋ธ์ ํธ
}, 2000)
})
promise.then((value)=>{
console.log(value) // 2์ด ๋ค์ no network ์ถ๋ ฅ
})
- catch : ์๋ฌ๊ฐ ๋ฐ์ ํ์ ๋ ์ด๋ป๊ฒ ์ฒ๋ฆฌ ํ ๊ฒ ์ธ์ง ์ฝ๋ฐฑ ํจ์ ๋ฑ๋ก
- ๋ ์ด์ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๊ณ ์ฐ๋ฆฌ๊ฐ ๋ฐ์์จ ์๋ฌ ๋ฉ์ธ์ง ๊ฐ ์ถ๋ ฅ ๋ฉ๋๋ค.
promise
.then((value)=>{ // value ๋ promise ๊ฐ ์ ์์ ์ผ๋ก ์ ์ํ์ด ๋์ด์ ๋ง์ง๋ง์ผ๋ก resolve ์ฝ๋ฐฑํจ์์์ ์ ๋ฌ๋ 'hyunho'๋ผ๋ ๊ฐ์ด ๋ค์ด๊ฐ๋ค.
console.log(value)
})
.catch(error =>{
console.log(error)
})
- finally : ์ฑ๊ณตํ๋ ์คํจํ๋ ์๊ด ์์ด ๋ฌด์กฐ๊ฑด ๋ง์ง๋ง์ ํธ์ถ
promise .then((value)=>{
// value ๋ promise ๊ฐ ์ ์์ ์ผ๋ก ์ ์ํ์ด ๋์ด์ ๋ง์ง๋ง์ผ๋ก resolve ์ฝ๋ฐฑํจ์์์ ์ ๋ฌ๋ 'hyunho'๋ผ๋ ๊ฐ์ด ๋ค์ด๊ฐ๋ค. console.log(value) })
.catch(error =>{ console.log(error) })
.finally(()=>{ console.log('finally') })
promise ์ฐ๊ฒฐํ๊ธฐ
const fetchNumber = new Promise((resolve, reject)=>{
setTimeout(()=> resolve(1), 1000)
})
fetchNumber
.then(num => num * 2) // 1์ด num์ ์ ์ฅ
.then(num => num * 3) // 2๊ฐ num์ ์ ์ฅ
.then(num =>{ // 6์ด num์ ์ ์ฅ
return new Promise((resolve, reject)=>{
setTimeout(()=>{
resolve(num - 1)
}, 1000)
})
})
.then(num => console.log(num)) // 5 ์ถ๋ ฅ
- then ์ ๊ฐ์ ๋ฐ๋ก ์ ๋ฌ ํ ์๋ ์๊ณ , promise ๋ฅผ ์ ๋ฌ ํ ์ ์์ต๋๋ค.
์ค๋ฅ์ฒ๋ฆฌ ํ๋ ๋ฐฉ๋ฒ
const getHen = ()=>
new Promise((resolve, reject)=>{
setTimeout(()=>
resolve('๐')
,1000)
})
const getEgg = hen =>
new Promise((resolve, reject)=>{
setTimeout(()=>
reject(new Error(`${hen}=>๐ฅ`))
,1000)
})
const cook = egg =>
new Promise((resolve, reject)=>{
setTimeout(()=>
resolve(`${egg}=>๐ณ`)
,1000)
})
getHen()
.then(getEgg)
.catch(error =>{ // getEgg๋ฅผ ๋ฐ์์ฌ ๋ ๋ฌธ์ ๊ฐ ์๊ธด๋ค๋ฉด
return '๐'
})
.then(cook)
.then(console.log)
.catch(console.log
- egg ๋ถ๋ถ์ ๋ฌธ์ ๊ฐ ์์ง๋ง ๋ค๋ฅธ ์์์ผ๋ก ๋์ฒด ํ๊ณ ์ถ์ ๊ฒฝ์ฐ
- egg๋ฅผ ๋ฐ์ ์ ์์ง๋ง ํผ์๋ก ๋์ ํ์ฌ promise ๊ฐ ์ ์คํ ๋ฉ๋๋ค.
- ๋ฌธ์ ๊ฐ ์๋ ๊ณณ ์์ ๋ฐ๋ก catch ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
์ ๋ฆฌ
- ์ ํต์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํ ํ๋์ ํจํด์ผ๋ก ์ฝ๋ฐฑ ํจ์๋ฅผ ์ฌ์ฉ ํฉ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ฐ ์ฝ๋ฐฑ ํจํด์ ์ฝ๋ฐฑ ํฌ๋ก ์ธํด ๊ฐ๋ ์ฑ์ด ๋์๊ณ , ๋น๋๊ธฐ ์ฒ๋ฆฌ ์ค ๋ฐ์ํ ์๋ฌ์ ์ฒ๋ฆฌ๊ฐ ๊ณค๋ํ์ฌ ES6๋ถํฐ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํ Promise๊ฐ ๋์ ๋์์ต๋๋ค.
- promise๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ์ฑ๊ณตํ๋ฉด resolve ๋ฉ์๋๋ฅผ ํธ์ถํด์ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ํ์์ฒ๋ฆฌ ๋ฉ์๋(then)๋ก ์ ๋ฌ
- promise๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ์คํจํ๋ฉด reject ๋ฉ์๋๋ฅผ ํธ์ถํด์ ์๋ฌ๋ฉ์์ง๋ฅผ ํ์์ฒ๋ฆฌ ๋ฉ์๋(catch)๋ก ์ ๋ฌ
์ฐธ๊ณ
'๐ Front-End > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์๊ฒฉ๋ชจ๋(use strict) (0) | 2022.11.17 |
---|---|
Async / Await (0) | 2022.11.17 |
AJAX (0) | 2022.11.17 |
ํด๋ก์ (closure) (0) | 2022.11.16 |
class (0) | 2022.11.16 |