๐ Chapter 9 : ์ธ๋ถ ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ผ.
๐ฏ ํ๋ผ๋ฏธ์ค๋ฅผ ์ด์ฉํด ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ผ.โ
- ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋น๋๊ธฐ ์ธ์ด์ด๋ค. ๋น๋๊ธฐ ์ธ์ด๋ ๊ทธ์ ์ด์ ์ ์ฝ๋๊ฐ ์์ ํ ํด๊ฒฐ๋์ง ์์๋ ์ด์ด์ง๋ ์ฝ๋๋ฅผ ์คํํ ์ ์๋ ์ธ์ด๋ฅผ ์๋ฏธํ๋ค.
- ๋น๋๊ธฐ ์ฝ๋์ ๋๊ธฐ ์ฝ๋์ ์ฐจ์ด์ ์ฐธ๊ณ
- ๋น๋๊ธฐ ์ธ์ด์ ๊ฐ์น๋ ์ง์ฐ๋ ์ ๋ณด๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ์ด ์ ๋ณด๊ฐ ํ์ํ์ง ์์ ๋ค๋ฅธ ์ฝ๋๋ฅผ ์คํํ ์ ์๋ค๋ ์ ์ ์๋ค. ( ์ง์ฐ๋ ์ ๋ณด๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ์ฝ๋๊ฐ ๋ฉ์ถ์ง ์๋๋ค.)
- ๋น๋๊ธฐ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฒ์ธ ํ๋ผ๋ฏธ์ค(Promise)๊ฐ ์๋ค. (๋ชจ๋ JavaScript ํํ ๋ฆฌ์ผ ์ฐธ๊ณ )
- ํ๋ผ๋ฏธ์ค๊ฐ ๋ฑ์ฅํ๊ธฐ ์ ์๋ ์ฝ๋ฐฑ(Callback) ํจ์๋ฅผ ์ฌ์ฉํด ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌํ๋ค.
- ๋ฐ์ดํฐ ์๋ณธ์ ๋น์ฉ์ ์์ฒญํ ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ธ์๋ก ๋๊ฒจ์ฃผ๊ณ , ์ด ํจ์๊ฐ ๋น๋๊ธฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ ํ์๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ํธ์ถํ๋ค. (์:
setTimeout()
) - ๋ค์ ์์ ๋
setTimeout()
์ ์ฌ์ฉํ ๋น๋๊ธฐ ์ฒ๋ฆฌ ์ฝ๋์ด๋ค.
function getUserPreferences(cb) {
return setTimeout(() => {
cb({
theme: 'dusk',
});
}, 1000);
}
function log(value) {
return console.log(value);
}
log('starting'); // starting
getUserPreferences(preference => {
return log(preference.theme.toUpperCase());
});
log('ending?'); // ending?
// DUSK
- ์ฝ๋ฐฑ ํจ์๋ ๋น๋๊ธฐ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ์ข์ ๋ฐฉ๋ฒ์ด๊ณ ์ค๋ซ๋์ ํ์ค์ ์ธ ๋ฐฉ๋ฒ์ด์๋ค.
- ํ์ง๋ง, ๋ฌธ์ ๋ ๋น๋๊ธฐ ํจ์์์ ๋ ๋น๋๊ธฐ ํจ์๋ฅผ ํธ์ถํ๊ณ , ๊ฑฐ๊ธฐ์ ๋ ๋น๋๊ธฐ ํจ์๋ฅผ ํธ์ถํด ๋ง์นจ๋ด ๋๋ฌด๋ ๋ง์ ์ฝ๋ฐฑ์ด ์ค์ฒฉ๋๋ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ๋ ๊ฒ์ด๋ค.
- ์ด๋ฐ ๊ฒฝ์ฐ ๋ฅผ ์๋ ์ฌ์ง๊ณผ ๊ฐ์ด ์ฝ๋ฐฑ ์ง์ฅ(Callback Hell) ์ด๋ผ๊ณ ํ๋ค.
- ํ๋ผ๋ฏธ์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฌํ ์ฝ๋ฐฑ ํจ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
- ํ๋ผ๋ฏธ์ค๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ธ์๋ก ํ๋ ๋์ ์ ์ฑ๊ณต๊ณผ ์คํจ์ ๋์ํ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
- ํ๋ผ๋ฏธ์ค๋ ๋น๋๊ธฐ ์์ ์ ์ ๋ฌ๋ฐ์์ ์๋ต์ ๋ฐ๋ผ ๋ ๊ฐ์ง ๋ฉ์๋ ์ค ํ๋๋ฅผ ํธ์ถํ๋ ๊ฐ์ฒด์ด๋ค.
- ํ๋ผ๋ฏธ์ค๋ ๋น๋๊ธฐ ์์
์ด ์ฑ๊ณตํ๊ฑฐ๋ ์ถฉ์กฑ๋ ๊ฒฝ์ฐ
then()
๋ฉ์๋์ ๊ฒฐ๊ณผ๋ฅผ ๋๊ฒจ์ค๋ค. - ๋น๋๊ธฐ ์์
์ ์คํจํ๊ฑฐ๋ ๊ฑฐ๋ถ๋๋ ๊ฒฝ์ฐ์๋ ํ๋ก๋ฏธ์ค๊ฐ
catch()
๋ฉ์๋๋ฅผ ํธ์ถํ๋ค. then()
๊ณผcatch()
๋ฉ์๋์๋ ๋ชจ๋ ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌํ๋ค.- ์ด๋ ๋ ๋ฉ์๋์ ์ธ์๋ก ์ ๋ฌ๋๋ ํจ์์๋ ๋น๋๊ธฐ ์์ ์ ๊ฒฐ๊ณผ์ธ ์๋ต๋ง์ด ์ธ์๋ก ์ ๋ฌ๋๋ค.
- ํ๋ผ๋ฏธ์ค๋ ๋ ๊ฐ์ ์ธ์,
resolve()
์reject()
๋ฅผ ์ ๋ฌ๋ฐ๋๋ค. resolve()
๋ ์ฝ๋๊ฐ ์๋๋๋ก ๋์ํ์ ๋ ์คํ๋๊ณresolve()
๊ฐ ํธ์ถ๋๋ฉดthen()
๋ฉ์๋์ ์ ๋ฌ๋ ํจ์๊ฐ ์คํ๋๋ค.
function getUserPreferences() {
const preference = new Promise((resolve, reject) => {
resolve({
theme: 'dusk',
});
});
return preference;
}
// ์ฑ๊ณตํ ๊ฒฝ์ฐ then() ๋ฉ์๋๋ฅผ ์ด์ฉํด์ ์ฝ๋๋ฅผ ํธ์ถ
getUserPerferences()
.then(preference => {
console.log(preference.theme);
});
// 'dusk'
- ํ๋ผ๋ฏธ์ค๋ฅผ ์ค์ ํ ๋
then()
๊ณผcatch()
๋ฉ์๋๋ฅผ ๋ชจ๋ ์ฌ์ฉํ ์ ์๋ค. - ๋ค์์ ์คํจํ๋ ํ๋ผ๋ฏธ์ค์ด๋ค. ์ธ์์ ์๋
reject()
๊ฐ ํธ์ถ๋๋ค.
function failUserPreference() {
const finder = new Promise((resolve, reject) => {
reject({
type: '์ ๊ทผ ๊ฑฐ๋ถ๋จ',
});
});
return finder;
}
- ํ๋ผ๋ฏธ์ค๋ฅผ ํธ์ถํ ๋
then()
๋ฉ์๋์catch()
๋ฉ์๋๋ฅผ ์ฐ๊ฒฐํด์ ์ถ๊ฐํ ์ ์๋ค.
failUserPreference()
.then(preference => {
// ์คํ๋์ง ์๋๋ค.
console.log(preference.theme);
})
.catch(error => {
console.log(`์คํจ: ${error.type}`);
});
// ์คํจ: ์ ๊ทผ ๊ฑฐ๋ถ๋จ
- ๋ค์ ์์ ๋ ์ค์ฒฉ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ํ๋ผ๋ฏธ์ค๋ก ๋ณ๊ฒฝํ ์ฝ๋์ด๋ค.
function getMusic(theme) {
if(theme === 'dusk') {
return Promise.resolve({
album: 'music for airports',
});
return Promise.resolve({
album: 'kind of blue',
});
}
}
getUserPreferences()
.then(preference => {
return getMusic(preference.theme);
})
.then(music => {
console.log(music.album);
});
// music for airports
- ์ฌ๋ฌ ๊ฐ์ ์ค์ฒฉ๋ ์ฝ๋ฐฑ ํจ์์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋์ ์ฌ๋ฌ ๊ฐ์
then()
๋ฉ์๋๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์๋๋ก ๋ด๋ ค์ฃผ๋ ๊ฒ์ด๋ค. - ์์ ์ฝ๋๋ฅผ ์๋์ ๊ฐ์ด ๋ณ๊ฒฝํด ์ค ์ ์๋ค.
getUserPreferences()
.then(preference => getMusic(preference.theme))
.then(music => { console.log(music.album); });
- ๋์ผ๋ก, ํ๋ผ๋ฏธ์ค๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฒฝ์ฐ์๋
catch()
๋ฉ์๋๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ์ฐ๊ฒฐํ ํ์๊ฐ ์๋ค. catch()
๋ฉ์๋๋ฅผ ํ๋๋ง ์ ์ํด์ ํ๋ผ๋ฏธ์ค๊ฐ ๊ฑฐ์ ๋๋ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค.
function getArtist(album) {
return Promise.resolve({
artist: 'Brian Eno',
});
}
function failMusic(theme) {
return Promise.reject({
type: '๋คํธ์ํฌ ์ค๋ฅ',
});
}
getUserPreferences()
.then(preference => failMusic(preference.them))
.then(music => getArtist(music.album))
// ๊ฑฐ๋ถ๋ ๋(reject) ์คํ๋๋ค.
.catch(e => {
console.log(e);
});
// {type: "๋คํธ์ํฌ ์ค๋ฅ"}
- ํ๋ผ๋ฏธ์ค๊ฐ ๋ด๊ธด ๋ฐฐ์ด์ ๋ฐ์ ๋ชจ๋ ํ๋ผ๋ฏธ์ค๊ฐ ์ข
๋ฃ๋์์ ๋์ ์ฑ๊ณต ๋๋ ์คํจ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋
Promise.all
์ด๋ผ๋ ๋ฉ์๋๋ ์๋ค. (MDN, ๋ชจ๋ javascript ํํ ๋ฆฌ์ผ)
๐ฏ async/await๋ก ํจ์๋ฅผ ๋ช ๋ฃํ๊ฒ ์์ฑํ๋ผ.โ
- ํ๋ผ๋ฏธ์ค๋ ์ฝ๋ฐฑ๊ณผ ๋น๊ตํ๋ฉด ์์ฒญ๋ ๋ฐ์ ์ด์ง๋ง ์ธํฐํ์ด์ค๊ฐ ์ฌ์ ํ ๋ค์ ํฌ๋ฐํ๋ค.
- ํ๋ผ๋ฏธ์ค๋ฅผ ์ฌ์ฉํด๋ ์ฌ์ ํ ๋ฉ์๋์์ ์ฝ๋ฐฑ์ ๋ค๋ค์ผ ํ๋ค.
async/await
๋ฅผ ์ด์ฉํด ํ๋ผ๋ฏธ์ค๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค.async
ํค์๋๋ฅผ ์ด์ฉํด์ ์ ์ธํ ํจ์๋ ๋น๋๊ธฐ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.- ๋น๋๊ธฐ ํจ์์ ๋ด๋ถ์์
await
ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ด ๋ฐํ๋ ๋๊น์ง ํจ์์ ์คํ์ ์ค์ง์ํฌ ์ ์๋ค. async/await
๋ ํ๋ผ๋ฏธ์ค๋ฅผ ๋์ฒดํ์ง๋ ์๋๋ค. ๋จ์ง ํ๋ผ๋ฏธ์ค๋ฅผ ๋ ๋์ ๋ฌธ๋ฒ์ผ๋ก ๊ฐ์ธ๋ ๊ฒ์ ๋ถ๊ณผํ๋ค.- ์๋ ์ฝ๋๋ ํ๋ผ๋ฏธ์ค๋ฅผ ์ฌ์ฉํ๋ ์์ ์ฝ๋๋ฅผ
async/await
๋ก ๋ณ๊ฒฝํ ์ ์๋ค.
getUserPreferences()
.then(preference => {
console.log(preference.theme);
});
// 'dusk'
async function getTheme() {
const { theme } = await getUserPreferences();
return theme;
}