โ Promise
- js์์ ์ ๊ณตํ๋ฉฐ, ๋น๋๊ธฐ๋ฅผ ๊ฐํธํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋๋ก ๋์์ฃผ๋ object
- ์ ํด์ง ๊ธฐ๋ฅ ์ํ ํ ์ฑ๊ณต ์ ์ฑ๊ณต ๋ฉ์์ง์ ๊ฒฐ๊ณผ๊ฐ ์ ๋ฌ
- ๊ธฐ๋ฅ ์ํ ์ ๋ฌธ์ ๋ฐ์ ์ ์๋ฌ ์ ๋ฌ
- ๋น๋๊ธฐ์ ์ธ ๊ฒ์ ์ํํ๊ธฐ ์ํด Callbackํจ์ ๋์ ์ ์ ์ฉํ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅ
โ Point
- 1. State: process๊ฐ heavyํ operation์ ์ํ ์ค์ธ์ง, ๊ธฐ๋ฅ ์ํ์ ์ฑ๊ณต/์คํจ ํ๋์ง
- 2. Producer(์ ๋ณด์ ๊ณต์) / Consumer(์ ๋ณด์ฌ์ฉ์)์ ์ฐจ์ด์
- Promise๋ class โก new ํค์๋๋ฅผ ํตํด ์์ฑํ ์ ์๋ค.
- ์์ฑ์: executor๋ผ๋ ์ฝ๋ฐฑํจ์ ์ ๋ฌ
- executor ์์์๋ ๋ค์ resolve์ reject ์ฝ๋ฐฑํจ์ ์ ๋ฌ
- resolve: ๊ธฐ๋ฅ ์ ์ ์ํ ํ ์ต์ข ๋ฐ์ดํฐ ์ ๋ฌ
- reject: ๊ธฐ๋ฅ ์ํ ์ค ๋ฌธ์ ๋ฐ์ ์ ํธ์ถ
- Promise๋ฅผ ๋ง๋๋ ์๊ฐ, executor๋ ๋ฐ๋ก ์คํ๋๋ค. (์ฆ, ์ฌ์ฉ์๊ฐ ์๊ตฌํ์ ๋๋ง ๋คํธ์ํฌ ์์ฒญ์ ํด์ผํ๋ ๊ฒฝ์ฐ๋ผ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค!)
1. Producer
1-1. Resolve
const promise = new Promise((resolve, reject) => {
// doing some heavy work (network, read files)
console.log('doing something...');
setTimeout(() => {
resolve('ellie');
}, 2000);
});
1-2. Reject
- ๋ณดํต Error๋ผ๋ object๋ฅผ ํตํด ๊ฐ์ ์ ๋ฌํ๋ค.
const promise = new Promise((resolve, reject) => {
// doing some heavy work (network, read files)
console.log('doing something...');
setTimeout(() => {
//resolve('ellie');
reject(new Error('no network'));
}, 2000);
});
2. Consumer
- then, catch, finally๋ฅผ ์ด์ฉํด์ ๊ฐ์ ๋ฐ์์ฌ ์ ์๋ค.
- promise๊ฐ ์ ์์ ์ผ๋ก ์ ์ํ๋ ํ ์ต์ข ์ ์ผ๋ก resolve๋ฅผ ํตํด ์ ๋ฌ๋ ๊ฐ์ด ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋๋ค.
2-1. Resolve์ ๊ฐ์ ๋ฐ์์ค๋ ๊ฒฝ์ฐ
promise.then((value) => {
console.log(value);
})
2-2. Reject์ ๊ฐ์ ๋ฐ์์ค๋ ๊ฒฝ์ฐ
๊ฐ) then์ ์ด์ฉํด์ ์ฑ๊ณต์ ์ธ case๋ง ๋ค๋ฃจ๋ ๊ฒฝ์ฐ
promise.then((value) => {
console.log(value);
})
๋) Error handling
- then์ ์ด์ฉํด์ ์ฑ๊ณต์ ์ธ case๋ฅผ ์ ๋ค๋ค๋ค๋ฉด, catch๋ฅผ ํตํด error ๋ฐ์ ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ๊ฒ์ธ์ง ์ฝ๋ฐฑํจ์๋ฅผ ๋ฑ๋กํ๋ค.
- Chaining: then์ ํธ์ถํ๋ฉด Promise๋ฅผ returnํ๊ธฐ ๋๋ฌธ์, ๊ฑฐ๊ธฐ์ ๋ค์ catch ํธ์ถ ๊ฐ๋ฅ
promise
.then((value) => {
console.log(value); // ์ฑ๊ณตํ ๊ฐ
})
.catch(error => { // ์คํจํ error
console.log(error);
})
3-3. Resolve, Reject์ ์๊ด์์ด ๋ง์ง๋ง์ ๋ฌด์กฐ๊ฑด ํธ์ถ๋๋ ๊ฒฝ์ฐ
promise
.then((value) => {
console.log(value);
}).catch(error => {
console.log(error);
})
.finally(() => {
console.log('finally');
});
๊ฐ) Resolve์ธ ๊ฒฝ์ฐ
๋) Reject์ธ ๊ฒฝ์ฐ
3. Promise chaining
- then์ ๊ฐ์ ๋ฐ๋ก ์ ๋ฌํ ์๋ ์๊ณ , ๋ ๋ค๋ฅธ ๋น๋๊ธฐ์ธ Promise๋ฅผ ์ ๋ฌํด๋ ๋๋ค!
const fetchNumber = new Promise((resolve, reject) => {
setTimeout(() => resolve(1), 1000);
});
fetchNumber
.then(num => num * 2)
.then(num => num * 3)
.then(num => {
return new Promise((resolve, reject) => {
setTimeout(() => resolve(num - 1), 1000);
});
})
.then(num => console.log(num));
// ์ด 2์ด ์์!
4. Error Handling
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) // .then(hen => getEgg(hen))
.catch(error => {
return '๐'; // getEgg์์ ์๋ฌ ๋ฐ์ํ์ ๋, ๋์ ๋นต์ ๋ฐ์์จ๋ค!
}) // ํ์ํ ๊ณณ์ ์ ์ ํ ์์๋ก ๋ฐฐ์นํ๋ ๊ฒ ์ค์
.then(cook) // .then(egg => cook(egg))
.then(console.log); // .then(meal => console.log(meal));
5. Callback to Promise
// Callback Hell example
class UserStorage {
loginUser(id, password) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if(
(id === 'ellie' && password === 'dream') ||
(id === 'coder' && password === 'academy')
) {
resolve(id);
} else {
reject(new Error('not found'));
}
}, 2000);
});
}
getRoles(user) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if(user === 'ellie') {
resolve({name: 'ellie', role: 'admin'});
} else {
reject(new Error('no access'));
}
}, 1000);
});
}
}
const userStorage = new UserStorage();
const id = prompt('enter your id');
const password = prompt('enter your password');
userStorage
.loginUser(id, password)
.then(userStorage.getRoles)
.then(user => alert(`Hello ${user.name}, you have a ${user.role} role`))
.catch(console.log);
์ฐธ๊ณ
youtube ๋๋ฆผ์ฝ๋ฉ by ์๋ฆฌ
https://www.youtube.com/watch?v=JB_yU6Oe2eE&list=PLv2d7VI9OotTVOL4QmPfvJWPJvkmv6h-2&index=12
'language > javascript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์๋ฐ์คํฌ๋ฆฝํธ ํจ์ ๊ธฐ๋ณธํธ (0) | 2021.12.02 |
---|---|
JavaScript async์ await, ์ ์ฉํ Promise APIs (0) | 2021.11.30 |
๋น๋๊ธฐ ์ฒ๋ฆฌ์ ์์, ์ฝ๋ฐฑ ์ดํดํ๊ธฐ (0) | 2021.11.30 |
JSON ๊ฐ๋ ์ ๋ฆฌ (0) | 2021.11.26 |
์ ์ฉํ 10๊ฐ์ง ๋ฐฐ์ด ํจ์๋ค (0) | 2021.11.26 |