Promise
์ง๊ธ์ผ๋ก๋ถํฐ ์๊ฐ์ด ๋๋ ์ฌ์ด์ ์ผ์ด๋ ์ด๋ค ์ผ์ด๋ผ ํ ์ ์๋ค. ๋ฏธ๋์ ์ด๋ค์ผ์ด ์๊ธธ ์ ์์ง๋ง ์ง๊ธ ๋ฐ๋ก ์ผ์ด๋์ง ์๋๋ค.
Promise๊ฐ ์์๋ '๋ ๋๋ ๋ง์ผ..' ์์
ES5 with jQuery
console.log(1);
$.get({
url: SOME_URL,
success: function (data) { // ์๋ฒ๋ก ๊ฐ๋ค๊ฐ ์ค๋ ๋น๋๊ธฐ๋ก ์์
๋๋ค.
console.log(3);
console.log(data.items.length);
// successํ๊ณ ๋ ํ ๋ค์ํ ์ผ์ ํ๊ณ ์ถ์ผ๋ฉด
// ์ฌ๊ธฐ์ ๋ด์ฉ์ ์ค์ค์ค ๋ง์ด ์ธ ์ ๋ฐ์ ์๋ ๋ถํธํจ์ด ์๋ค.
},
error: function (error) {
console.error(error);
}
});
console.log(2);
์ด์ ์๋ es5์ jquery๋ฅผ ์ด์ฉํด get์ด๋ผ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ success์ error๋ฅผ ๋ฐ์ get์ด๋ผ๋ method๋ setTimeout๊ณผ ์ ์ฌํ๋ค๊ณ ๋ณผ ์ ์๋ค.
continuation passing style (ํจ์๋ฅผ ์ง์์ ์ผ๋ก ๋๊ฒจ์ค๋ค.) - async.js ๋ฉ์๋ ์์๋
function foo (a, b, c, callback) {
// ...๋น๋๊ธฐ๊ฐ ์ด๋ฃจ์ด์ง๊ณ
// ๋น๋๊ธฐ๊ฐ ์๋ฃ ๋์ ๋ callback() ํธ์ถํด์ฃผ๋ ํจํด์ด ๋ง์๋ค.
// compete : callback();
}
// foo -> bar -> baz
// ์ง์์ ์ผ๋ก ์ฝ๋ฐฑ์ ๋๊ฒจ์ฃผ๋ ๊ฒ์ด๋ค.์ฎ์ด ๋ค์ด๊ฐ๋ค.
// ์ด๋ ๊ฒ ๋ณด์ฅ ๋ฐ์์ ์ฝ๋ฐฑ์ ์ ๋ฌํ๋๋ฐ ์ด๋ฌํ ๊ฒฝ์ฐ callbackhell์ ๋น ์ง ์ ์๋ค.
// ์ฐธ๊ณ ์ฌ์ดํธ: callbackhell.com
Promise - ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ก๋ค. (๋ฅ๋์ )
var youtubePromise = new Promise(function (resolve, reject) { //new Promise ์ค๋ธ์ ํธ๋ค.
$.get({
url: SOME_URL,
success: function (data) {
resolve(data);
},
error: function (error) {
reject(error);
}
});
});
youtubePromise.then(function (data) {
console.log('Success:', data.items.length);
}).catch(function (error) {
console.error('Error:', error);
});
๊ฐ์ฅ ํฌ๊ฒ ๋ฌ๋ผ์ง ๋ถ๋ถ
var youtubePromise = new Promise(function (resolve, reject) { //new Promise ์ค๋ธ์ ํธ๋ค.
new๋ผ๊ณ ๊ธ์์ ํจ๊ป Promise๊ฐ ์ฐ์๋ค. new๊ฐ ํ๋ ์ผ์ด ๋ฌด์์ธ๊ฐ. ์ธ์คํด์ค, ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์ค๋ค.
์ด์ (Promise๊ฐ ์์์ ๋์)๊น์ง๋ ์๋์ ์ธ ํ๋์๋ค. ๊ธฐ์กด์๋ ์์ ์ฅ ์ ์๋ ๋ฌผ๊ฑด์ด ์์๊ธฐ ๋๋ฌธ์, ํธ์ถ์ด ์๋ฃ ๋ ๋๊น์ง ๋ง๋ฅ ๊ธฐ๋ค๋ฆฌ๋ค๊ฐ ํธ์ถ๋๋ฉด '๊ฐ์ฌํฉ๋๋ค' ํ๊ณ ๋ค์๊ฒ์ ํ๊ณ ๋ ํธ์ถํ๋ฉด ๊ฐ์ฌํฉ๋๋ค
ํ๊ณ ๋ค์ ๊ฒ์ ํ์๋ค. ๋ค ๋๋๋ฉด ์ด๊ฑฐ ํด์ฃผ์ธ์~ ํ๊ณ ์๋์ ์ธ ํ๋์๋ค.
ํ์ง๋ง ์ง๊ธ์
new Promise => ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ค๋ค. ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ๋์์ค๋ค.
๊ฐ์ฒด๋ผ๋๊ฒ ๋ง๋ค์ด ์ก๋ค. ์์ ์ฅ ์ ์๋ ๋ฌผ๊ฑด์ด ๋ง๋ค์ด ์ก๋ค. ๋ถํ์ ํ๊ณ ์ค๋ฌผ๋ก ๊ฐ๊ฒ ๋์๋ค. ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ฒด์งํฅ๊ณผ ์ ๋ชฉํ์ฌ ๋น๋๊ธฐ๋ฅผ ๋ค๋ฅผ ์ ์๊ฒ ํ์๋ค.
์๋๋ ํจ์๋ก ๋ง๋ค๊ณ ๊ธฐ๋ค๋ฆฌ๊ธฐ๋ง ํ๋๋ฐ ์์ ๋๊ฐ ๋์ด๋๊ณ ๋ฅ๋์ ์ผ๋ก ํ ์ ์๊ฒ ๋์๋ค.
ํ์ฉ์ฑ์ด ํจ์ฌ ์ปค์ก๋ค.
peomise๋ฅผ ์จ๋ callbackhell์ด ๋ํ๋ ์ ์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ promise๊ฐ callbackhell๋ฅผ ํด๊ฒฐํด ์ค๋ค. ํ๋๊ฑด ์๋ชป๋๊ฑฐ๋ค.
๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ก์ง์ new Promise๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ก ๋ฐ๋๋ค๋ ์๋ฏธ - ํ์ฉ์ฑ(์์ ๋, ๋ฅ๋์ฑ)์ด ๋ค์ํด ์ก๋ค.
๋ณ์์ ๋ด์ ์๋ ์๋ค.
๋ณ์๋ฅผ ๋๊ฒจ์ค ์ ์๋ค.
return ํ ์ ์๋ค.
์ฐจ๊ทผ์ฐจ๊ทผ ์ดํด๋ณด์
var youtubePromise = new Promise(function (resolve, reject) { //new Promise ์ค๋ธ์ ํธ๋ค.
$.get({
url: SOME_URL,
success: function (data) {
resolve(data);
},
error: function (error) {
reject(error);
}
});
});
new Promise๋ ์ธ์๋ก ํจ์๋ฅผ ํ๋ ๋ฐ๋๋ค.
๊ทธ ํจ์์๋
resolve
์reject
๋ผ๋ ์ธ์๋ฅผ ๋ฐ๋๋ค.์ด ๋๊ฐ๋ Promise์ธก์์ ์๋์ผ๋ก ๋๊ฒจ์ฃผ๋ ๊ฒ์ด๋ค.
new Promise์ ์ธ์๋ก ๋ฐ์ ํจ์ ๋ด๋ถ์์ ๋น๋๊ธฐ ์์ ์ ํ๋ค.
์ฝ๋๋ฅผ ๋ณด๋ฉด resolve์ reject๋ฅผ ์คํํ๋ค. ์ด๋
ํจ์
๋ผ๋ ๊ฒ์ด๋ค.์ฑ๊ณตํ๋ฉด์ resolve๋ฅผ ์คํํ๊ณ ์คํจํ๋ฉด reject๋ฅผ ์คํํ๋ค.
var youtubePromise
์ด ๋ณ์์๋ ๋น๋๊ธฐ ์์ ์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ๊ฐ์ฒด์ด๋ค. (Promise์ instance์ด๋ค)
Promise Instance์๋ then๊ณผ catch๋ฉ์๋๊ฐ ์๋ค.
youtubePromise.then(function (data) {
console.log('Success:', data.items.length);
}).catch(function (error) {
console.error('Error:', error);
});
new Promise์ ์ธ์คํด์ค์ด๋ค.
์ธ์คํด์ค์๋ then์ด๋ผ๋ ๋ฉ์๋์ catch๋ผ๋ ๋ฉ์๋๊ฐ ์๋ค.
then๊ณผ catch๋ ์ธ์๋ก function์ ๋ฐ๋๋ค.
then์ ์ธ์๋ก ๋ฐ์ ์ฝ๋ฐฑํจ์๋ resolve๋์ ๋ ์คํ๋๋ค.
catch๋ผ๋ ๋ฉ์๋๋ reject๋์ ๋ ์คํ๋๋ค.
then์ ์ธ์์ ์ฝ๋ฐฑํจ์์์ data๋ผ๋ ์ธ์๋ฅผ ๋ฐ๋๋ฐ ๊ทธ ์ธ์๋ success์์์ resolve๋ก ๋๊ฒจ์ค ๊ฒ์ด๋ค.
rejectํ์ ๋ ๋ฐ๋ error์ธ์๋ catch์ ์ฝ๋ฐฑํจ์ ์ธ์๋ก ์ ๋ฌ ๋๋ค.
then๊ณผ catch์ ์ธ์๋ก ๋ฐ์ callbackํจ์๋ ๋น๋๊ธฐ๋ก ์ด๋ฃจ์ด์ง๋ ๊ฒ์ด๋ค.
all
Promise.all(allItemsPromises).then(function (result) {
console.log(`${result.length}๊ฐ์ ์์ดํ
์ ๋ณด ์์ง ์๋ฃ`);
console.log(4);
}).catch(function () {
console.log('error');
});
});
promise๋ all์ด๋ผ๋ ๋ฉ์๋๊ฐ ์๋ค. ์ธ์๋ก๋ ๋ฐฐ์ด์ ๋ฐ๋๋ค. ๋ฐฐ์ด์์๋ promise์ instance๋ค์ด ๋ค์ด์๋ค. ๋ฐฐ์ด์ ์๋ promise๋ค์ด resolve๋๊ณ ๋๋ฉด์ then์ด ํธ์ถ๋๋ค. ์ด ์๋ฏธ๋ ๋ฐฐ์ด์ ์์๋ค์ด ์ ๋ถ resolve๊ฐ ๋๋ค๋ ๋ณด์ฅ์ ๋ฐ๊ณ ์ธ ์ ์๋ ๊ฒ์ด๋ค.
Last updated
Was this helpful?