Promise๊ฐ ๋ญ๊ฐ์?
ํ๋ก๋ฏธ์ค๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ์ฌ์ฉ๋๋ ๊ฐ์ฒด์ด๋ค.
์ฌ๊ธฐ์ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ ‘ํน์ ์ฝ๋์ ์คํ์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ
๋ค์ ์ฝ๋๋ฅผ ๋จผ์ ์ํํ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ํน์ฑ’์ ์๋ฏธํ๋ค.
์ผ๋ฐ์ ์ผ๋ก ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌํํ ๋ ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๊ณ ๋ฐ์์ค๊ธฐ ์ํด API๋ฅผ ์ฌ์ฉํ๋๋ฐ,
API๊ฐ ์คํ๋๋ฉด ์๋ฒ์๋ค๊ฐ ๋ฐ์ดํฐ ๋ณด๋ด๋ฌ๋ผ๋ ์์ฒญ์ ๋ณด๋ด๊ณ ,
๋ณด๋ด์จ ๋ฐ์ดํฐ์ ๋ฐํ๊ฐ์ด๋, ์๋ฌ์ํฉ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ํ๋ก๋ฏธ์ค๋ฅผ ์ฌ์ฉํ๋ค.
promise๋ฅผ ์ฌ์ฉํ ๋น๋๊ธฐ ์ฒ๋ฆฌ
function async() {
return new Promise((resolve, reject) => {
setTimeout(() => { // setTimeout <- api ํต์ ๊ฐ์ ํ์ 1์ด๋ค์ ์คํ๋๋๊ฑธ ๋ํ๋ด๊ธฐ ์ํจ
resolve("i'm here!!");
}, 1000);
})
}
async().then(res => {
console.log(res);
});
promise๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด resolve๋ ์ฑ๊ณตํ์ ๋, reject๋ ์๋ฌ๊ฐ ๋ฐ์ ํ์ ๋
์ฒซ ๋ฒ์งธ ์ธ์( ์์ ์์์์๋ res )๋ก ์ด๋ ํ ๊ฐ์ ๋๊ธธ ์ ์๋ค.
resolve๋ .then์ ์ฒซ ๋ฒ์งธ ์ธ์๋ก, reject๋ .catch์ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ๋ค์ด๊ฐ๋ค.
์ ์์์์ async ํจ์๋ฅผ ์คํํ๋ฉด 1์ด ํ ์ฒซ ๋ฒ์งธ ์ธ์์ "i'm here!!" ์ด ๋ค์ด๊ฐ resolve๊ฐ ์คํ์ด ๋๋ฉฐ.
์ด ์ธ์๋ .then์ ์ฒซ๋ฒ์งธ ์ธ์๋ ํจ์์ด๊ณ , ์ด ํจ์์ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ๋ฐ์์ ์ฝ์์ ์ฐํ๊ฒ ๋๋ค.
then
.then์ ํ๋ก๋ฏธ์ค์์ ๊ฐ์ฅ ์ค์ํ๊ณ ๊ธฐ๋ณธ์ด ๋๋ ๋ฉ์๋.
promise.then(
function(result) { /* ๊ฒฐ๊ณผ(result)๋ฅผ ๋ค๋ฃน๋๋ค */ },
function(error) { /* ์๋ฌ(error)๋ฅผ ๋ค๋ฃน๋๋ค */ }
);
.then์ ์ฒซ ๋ฒ์งธ ์ธ์๋ ํ๋ผ๋ฏธ์ค๊ฐ ์ดํ๋์์ ๋ ์คํ๋๋ ํจ์์ด๊ณ , ์ฌ๊ธฐ์ ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ผ๋ฉฐ.
.then์ ๋ ๋ฒ์งธ ์ธ์๋ ํ๋ผ๋ฏธ์ค๊ฐ ๊ฑฐ๋ถ๋์์ ๋ ์คํ๋๋ ํจ์์ด๊ณ , ์ฌ๊ธฐ์ ์๋ฌ๋ฅผ ๋ฐ๋๋ค.
๐ซ์์
let promise = new Promise(function(resolve, reject) {
setTimeout(() => resolve("์๋ฃ!"), 1000);
});
// resolve ํจ์๋ .then์ ์ฒซ ๋ฒ์งธ ํจ์(์ธ์)๋ฅผ ์คํํฉ๋๋ค.
promise.then(
result => alert(result), // 1์ด ํ "์๋ฃ!"๋ฅผ ์ถ๋ ฅ
error => alert(error) // ์คํ๋์ง ์์
);
์ฒซ ๋ฒ์งธ ํจ์ ์คํ.
ํ๋ผ๋ฏธ์ค๊ฐ ๊ฑฐ๋ถ๋ ๊ฒฝ์ฐ์๋ ์๋์ ๊ฐ์ด ๋ ๋ฒ์งธ ํจ์๊ฐ ์คํ.
์์ ์ด ์ฑ๊ณต์ ์ผ๋ก ์ฒ๋ฆฌ๋ ๊ฒฝ์ฐ๋ง ๋ค๋ฃจ๊ณ ์ถ๋ค๋ฉด .then์ ์ธ์๋ฅผ ํ๋๋ง ์ ๋ฌ.
catch
์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ๋ง ๋ค๋ฃจ๊ณ ์ถ๋ค๋ฉด .then(null, errorHandlingFunction)๊ฐ์ด null์ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌํ๋ฉด ๋ฉ๋๋ค.
.catch(errorHandlingFunction)๋ฅผ ์จ๋ ๋๋๋ฐ, .catch๋ .then์ null์ ์ ๋ฌํ๋ ๊ฒ๊ณผ ๋์ผํ๊ฒ ์๋ํฉ๋๋ค.
let promise = new Promise((resolve, reject) => {
setTimeout(() => reject(new Error("์๋ฌ ๋ฐ์!")), 1000);
});
// .catch(f)๋ promise.then(null, f)๊ณผ ๋์ผํ๊ฒ ์๋ํฉ๋๋ค
promise.catch(alert); // 1์ด ๋ค "Error: ์๋ฌ ๋ฐ์!" ์ถ๋ ฅ
.catch(f)๋ ๋ฌธ๋ฒ์ด ๊ฐ๊ฒฐํ๋ค๋ ์ ๋ง ๋นผ๊ณ .then(null,f)๊ณผ ์๋ฒฝํ๊ฒ ๊ฐ์ต๋๋ค.
function check(key) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (key === true) resolve("i'm here!!");
else reject(new Error("No I'm not here"))
}, 1000);
})
}
check(true)
.then((result) => { console.log(result); })
.catch((error) => { console.log(error); });
ํ๋ก๋ฏธ์ค๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ํ๋ก๋ฏธ์ค ๊ฐ์ฒด์ ๋น๋๊ธฐ๊ฐ ์ฒ๋ฆฌ๋ ๊ฒฐ๊ณผ๊ฐ์ด ์ ์ฅ๋ฉ๋๋ค.
์ฝ๋ฐฑ์ ๊ฒฝ์ฐ ๋งค๋ฒ ๋น๋๊ธฐ๋ฅผ ์คํํด์ผ์ง ๊ทธ ๊ฐ์ ์ถ๋ ฅํ ์ ์์ง๋ง
ํ๋ก๋ฏธ์ค๋ .then ๋ฉ์๋๋ฅผ ํตํด์ ์ ์ฅ๋์ด ์๋ ๊ฐ์ ์ํ๋ ๋์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํ๋ก๋ฏธ์ค์ 3๊ฐ์ง ์ํ(states)
ํ๋ก๋ฏธ์ค๋ฅผ ์ฌ์ฉํ ๋ ์์์ผ ํ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋ ์ด ๋ฐ๋ก ํ๋ก๋ฏธ์ค์ ์ํ(states)์ด๋ค.
์ํ๋ ํ๋ก๋ฏธ์ค์ ์ฒ๋ฆฌ ๊ณผ์ ์ ์๋ฏธํ๋ฉฐ, new Promise()๋ก ํ๋ก๋ฏธ์ค๋ฅผ ์์ฑํ๊ณ ์ข ๋ฃ๋ ๋๊น์ง 3๊ฐ์ง ์ํ๋ฅผ ๊ฐ๋๋ค.
- Pending(๋๊ธฐ) : ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ก์ง์ด ์์ง ์๋ฃ๋์ง ์์ ์ํ
- Fulfilled(์ดํ) : ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋์ด ํ๋ก๋ฏธ์ค๊ฐ ๊ฒฐ๊ณผ ๊ฐ์ ๋ฐํํด์ค ์ํ
- Rejected(์คํจ) : ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์คํจํ๊ฑฐ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ํ
Pending(๋๊ธฐ)
๋จผ์ ์๋์ ๊ฐ์ด new Promise() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ๋๊ธฐ(Pending) ์ํ๊ฐ ๋๋ค.
new Promise();
new Promise() ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ ์ธํ ์ ์๊ณ , ์ฝ๋ฐฑ ํจ์์ ์ธ์๋ resolve, reject์ด๋ค.
new Promise(function(resolve, reject) {
// ...
});
Fulfilled(์ดํ)
์ฌ๊ธฐ์ ์ฝ๋ฐฑ ํจ์์ ์ธ์ resolve๋ฅผ ์๋์ ๊ฐ์ด ์คํํ๋ฉด ์ดํ(Fulfilled) ์ํ๊ฐ ๋๋ฉฐ.
new Promise(function(resolve, reject) {
resolve();
});
์ดํ ์ํ๊ฐ ๋๋ฉด ์๋์ ๊ฐ์ด then()์ ์ด์ฉํ์ฌ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ ๊ฐ์ ๋ฐ์ ์ ์๋ค.
function getData() {
return new Promise(function(resolve, reject) {
var num = 1;
resolve(num);
});
}
// resolve()์ ๊ฒฐ๊ณผ ๊ฐ num์ resolvedData๋ก ๋ฐ์
getData().then(function(resolvedData) {
console.log(resolvedData); // 1
});
โป ํ๋ก๋ฏธ์ค์ '์ดํ' ์ํ๋ฅผ ์ข ๋ค๋ฅด๊ฒ ํํํด๋ณด๋ฉด '์๋ฃ' ์ด๋ค.
Rejected(์คํจ)
new Promise()๋ก ํ๋ก๋ฏธ์ค ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด ์ฝ๋ฐฑ ํจ์ ์ธ์๋ก resolve์ reject๋ฅผ ์ฌ์ฉํ ์ ์๋ค๊ณ ํ์ต๋๋ค. ์ฌ๊ธฐ์ reject๋ฅผ ์๋์ ๊ฐ์ด ํธ์ถํ๋ฉด ์คํจ(Rejected) ์ํ๊ฐ ๋ฉ๋๋ค.
new Promise(function(resolve, reject) {
reject();
});
๊ทธ๋ฆฌ๊ณ , ์คํจ ์ํ๊ฐ ๋๋ฉด ์คํจํ ์ด์ (์คํจ ์ฒ๋ฆฌ์ ๊ฒฐ๊ณผ ๊ฐ)๋ฅผ catch()๋ก ๋ฐ์ ์ ์์ต๋๋ค.
function getData() {
return new Promise(function(resolve, reject) {
reject(new Error("Request is failed"));
});
}
// reject()์ ๊ฒฐ๊ณผ ๊ฐ Error๋ฅผ err์ ๋ฐ์
getData().then().catch(function(err) {
console.log(err); // Error: Request is failed
});
promise(ํ๋ก๋ฏธ์ค)์ ์ฝ๋ฐฑ ํจ์ ๋ฐฉ์๊ณผ ์ฐจ์ด๋ก๋
callback์ ์ฌ์ฉํ๋ฉด ๋น๋๊ธฐ ๋ก์ง์ ๊ฒฐ๊ณผ๊ฐ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด์๋ callback์์์๋ง ์ฒ๋ฆฌ๋ฅผ ํด์ผํ๊ณ , ์ฝ๋ฐฑ ๋ฐ์์๋ ๋น๋๊ธฐ์์ ์จ ๊ฐ์ ์ ์๊ฐ ์์ต๋๋ค. ํ์ง๋ง promise๋ฅผ ์ฌ์ฉํ๋ฉด ๋น๋๊ธฐ์์์ ์จ ๊ฐ์ด promise ๊ฐ์ฒด์ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ์ฝ๋ ์์ฑ์ด ์ฉ์ดํด์ง๋๋ค.
๋,
Promise ํด๋์ค๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ง์ ์ํด ๋ง๋ค์ด์ก๊ธฐ ๋๋ฌธ์ ํด๋์ค์ resolve๋ reject ํจ์๋ค์ด ์ ์ ์๋์ด ์๊ณ ์ด๋ฅผ ์ ํ์ฉํ๊ธฐ๋ง ํ๋ฉด ๋์ง๋ง, callback pattern์ ์์ ๋๊ฐ ๋์ง๋ง template์ด ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฝ๋๊ฐ ๋ณต์กํด์ง๊ณ ์๋ฌ ์ฒ๋ฆฌ ๊ฐ์ ์์
๋ค์ด ์ด๋ ต์ต๋๋ค.
์ถ๊ฐ์ ์ผ๋ก ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํด ์ต๊ทผ์ ๋์จ async & await ๋ฌธ๋ฒ์ด ์์ผ๋ฉฐ,
์กด์ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฐฉ์์ธ ์ฝ๋ฐฑ ํจ์์ ํ๋ก๋ฏธ์ค์ ๋จ์ ์ ๋ณด์ํ๊ณ ๊ฐ๋ฐ์๊ฐ ์ฝ๊ธฐ ์ข์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๊ฒ ๋์์ค๋๋ค
๐์ถ์ฒ
https://danbom425.tistory.com/34
https://goodmemory.tistory.com/17
https://joshua1988.github.io/web-development/javascript/javascript-asynchronous-operation/
https://ko.javascript.info/promise-basics
https://ko.javascript.info/callbacks
https://joshua1988.github.io/web-development/javascript/promise-for-beginners/
'๐Technical interview(Front)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JS]์ด๋ฒคํธ ๋ฒ๋ธ๋ง๊ณผ ์บก์ฒ๋ง(Bubbling & Capturing) (0) | 2022.11.27 |
---|---|
๋ธ๋ผ์ฐ์ ์ ์ฅ์ ์ฐจ์ด์ ( Localstorage, SessionStorage, Cookie ) (0) | 2022.11.16 |
[JavaScript] ์ค์ฝํ ์ฒด์ธ์ด๋? (0) | 2022.11.09 |
[JavaScript] Scope๋? (0) | 2022.11.05 |
์ฝ๋ฐฑ ํจ์(Callback) (0) | 2022.11.03 |