November 10, 2020
์ง๊ธ๋ถํฐ ์์์ฃผ ์ฌ๋ฐ๋ ์ง์ ํด๋ณผ๊ฑฐ๋ค.
๋ญ ํ ๊ฑฐ๋๋ฉด
๊ฐ ์๋ฒ๋ง๋ค ์๋ฅผ ๋ฐ๊ณ ์๋ฅผ ์ก์์ ํ ๋๋ก์ธ์ ๋ฐ๊ณ ๊ทธ ๊ณ ๊ธฐ๋ฅผ ๋ฐ์๋ค๊ฐ ๋นํ ๋ถ๋ฅด๊ธฐ๋ฝ์ ๋ง๋๋ ๊ฑฐ๋ค.
const getCow = () =>
new Promise((resolve, reject) => {
setTimeout(() => resolve('๐'), 1000)
})
const getBeef = cow =>
new Promise((resolve, reject) => {
setTimeout(() => resolve(`${cow} => ๐ฅฉ`), 1000)
})
const cook = beef =>
new Promise((resolve, reject) => {
setTimeout(() => resolve(`${beef} => ๐ฅ`), 1000)
})
Producer ๋ฅผ ํด๋จ์ผ๋ ์ด์ Consume ํด๋ณด์.
getCow()
.then(cow => getBeef(cow)) // ์๋ฅผ ์ก์์์ ๊ณ ๊ธฐ๋ฅผ ์ป์ด๋ด๋..
.then(beef => cook(beef)) // ๊ณ ๊ธฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ฆฌ๋ฅผ ๋ง๋๋..
.then(meal => console.log(meal)) // ์์ฑ๋ ์๋ฆฌ๋ฅผ ๋ณด์ฌ์ค!
Promise {<pending>}
๐ => ๐ฅฉ => ๐ฅ
๐ => ๐ฅฉ => ๐ฅ
์ฐ์ ๋นํ ๋ถ๋ฅด๊ธฐ๋ฝ์ด๋ค!!
then ๋ด์์ ๋ฆฌํด๋๋ ํจ์๊ฐ ๋ฐ๋ ์ธ์๊ฐ ํ๋๋ง ์ผ๋ ์ฝ๋๋ฅผ ์๋์ ๊ฐ์ด ์ค์ผ ์ ์๋ค.
๋ฆฌํด๋๋ ํจ์์ ์์์ ๋ฐ์ ๋ฐธ๋ฅ๋ฅผ ๋ฃ์ด ๋ฆฌํดํด ๋ฌ๋ผ ๋ผ๋ ์๋ฌต์ ์ธ ๋์์ด๋ค.
getCow()
.then(getBeef) // ์๋ฅผ ์ก์์์ ๊ณ ๊ธฐ๋ฅผ ์ป์ด๋ด๋..
.then(cook) // ๊ณ ๊ธฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ฆฌ๋ฅผ ๋ง๋๋..
.then(console.log) // ์์ฑ๋ ์๋ฆฌ๋ฅผ ๋ณด์ฌ์ค!
Promise {<pending>}
๐ => ๐ฅฉ => ๐ฅ
์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ์๋ฌ ํธ๋ค๋ง์ ํด๋ณผ ์์๋ก ๋ฐ๊ฟ๋ณด์.
๋ง์ฝ ๋์ถ๊ณต์ฅ๋ค์ด ๋จ์ฒด ํ์ ์ ํด์ ์๊ณ ๊ธฐ๋ก ๊ฐ๊ณตํ๋ ๋ถ๋ถ์์ ๋ฌธ์ ๊ฐ ์๊ฒจ ์คํจ๋๋ฉด ์ด๋ป๊ฒ ํ ๊น?
const getCow = () =>
new Promise((resolve, reject) => {
setTimeout(() => resolve('๐'), 1000)
})
const getBeef = cow =>
new Promise((resolve, reject) => {
setTimeout(() => reject(new Error(`Error! BEEF union going ahead with strike ${cow} => ๐ฅฉ`)), 1000)
})
const cook = beef =>
new Promise((resolve, reject) => {
setTimeout(() => resolve(`${beef} => ๐ฅ`), 1000)
})
getCow()
.then(getBeef) // ์๋ฅผ ์ก์์์ ๊ณ ๊ธฐ๋ฅผ ์ป์ด๋ด๋..
.then(cook) // ๊ณ ๊ธฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ฆฌ๋ฅผ ๋ง๋๋..
.then(console.log) // ์์ฑ๋ ์๋ฆฌ๋ฅผ ๋ณด์ฌ์ค!
Promise {<pending>}
Uncaught (in promise) Error: Error! BEEF union going ahead with strike ๐ => ๐ฅฉ
at <anonymous>:8:29
์ ์๋ฆฌ๊ฐ ์๋ง๋ค์ด ์ง๋๋ฐ..
์ ์ด๋ฌ๋ฉด ๋๊ฐ๋ฆฐ๋ฐ..
ํน์ ๊ณผ์ ์ค์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค๋ฉด .catch ๋ก ์๋ฌ๋ฅผ ๋งจ ๋ฐ์ผ๋ก ์ ๋ฌํด์
catch ๊ฐ ์กํ์ง๊ฒ ํ์.
getCow()
.then(getBeef) // ์๋ฅผ ์ก์์์ ๊ณ ๊ธฐ๋ฅผ ์ป์ด๋ด๋..
.then(cook) // ๊ณ ๊ธฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ฆฌ๋ฅผ ๋ง๋๋..
.then(console.log) // ์์ฑ๋ ์๋ฆฌ๋ฅผ ๋ณด์ฌ์ค!
.catch(console.log)
Promise {<pending>}
Error: Error! BEEF union going ahead with strike ๐ => ๐ฅฉ
at <anonymous>:8:29
๋นจ๊ฐ์ Uncaught Error ๊ฐ ์๋ ๋จ์ ์๋ฌ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์๋ค.
์ด๋ฅผ ํตํด ์๋ฌ๋ฅผ ์ปจํธ๋กคํ์ฌ ์์ ํ ์ ์์์ ์๋ฏธํ๋ค.
์ ๋์ถ๊ณต์ฅ ํ์ ์ผ๋ก ์ธํด ์๊ณ ๊ธฐ๋ฅผ ๋ชป๊ฐ์ ธ์์ ๋ฐ์ ๋๋ ๊ตฌ๋ฅผ ๋,
์ผ๋งค ๊ผผ์๋ก ๋ผ์ง๊ณ ๊ธฐ๋ก ๋์ฒดํด ๋ฒ๋ฆฌ๊ณ ์ถ์ด์ก๋ค!
const getCow = () =>
new Promise((resolve, reject) => {
setTimeout(() => resolve('๐'), 1000)
})
const getBeef = cow =>
new Promise((resolve, reject) => {
setTimeout(() => reject(new Error(`Error! BEEF union going ahead with strike ${cow} => ๐ฅฉ`)), 1000)
})
const cook = beef =>
new Promise((resolve, reject) => {
setTimeout(() => resolve(`${beef} => ๐ฅ`), 1000)
})
getCow()
.then(getBeef) // ์ฌ๊ธฐ์ ์๊ณ ๊ธฐ๋ฅผ ๋์ด์ ๋ชป๊ฐ๊ณ ์ค๋ ์ค๋ฅ๊ฐ ์๊ธด๋ค. ๊ทธ๋?
.catch(error => {
return '๐'; // ๋ผ์ง ์กฑ๋ฐ์ ๊ธด๊ธ ๊ณต์ํด์๋ค.
})
.then(cook) // ๋ผ์ง ์์กฑ์ ๊ฐ์ง๊ณ ์๋ฆฌ๋ฅผ ๋ง๋๋..
.then(console.log) // ์์ฑ๋ ์๋ฆฌ๋ฅผ ๋ณด์ฌ์ค!
.catch(console.log) // ์๋ฌ ๋ฉ์์ง๋ ์ผ๋จ์ ๋์๋ฐ!
Promise {<pending>}
๐ => ๐ฅ
์๊ณ ๊ธฐ๋ฅผ ์ป์ด ์๋ฆฌ๋ฅผ ํ๋๋ฐ ์คํจํ์ง๋ง ์ ์ฒด์ ์ธ Promise ์ฒด์ธ์ ๋ฌธ์ ๊ฐ ์๊ธฐ์ง ์๋๋ก ๋ผ์ง ์์กฑ์ผ๋ก ๋๋นต์ ํด์ค๊ฑฐ๋ค.
๊ทธ๋ฆฌํ์ฌ ๊ฒฐ๊ตญ ์๋ฆฌ๊น์ง ์์ฑํ๋ค.
ํฌํฌ ๋ถ๋ฅด๊ธฐ๋ฝ.. (์ค์ ๋ก ํด๋ณธ ์ ์๋ค)
์ฆ! .then(getBeef) ์์ ์ค๋ฅ, error ๊ฐ ์๊ฒผ์ ๋ ๋ฐ๋ก ๋ค์ ์ค์ .catch ๋ฅผ ์์ฑํด์ ๋ฐ๋ก๋ฐ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.