๋น๋๊ธฐ์ฒ๋ฆฌ๋? ๋น๋๊ธฐ ์ฒ๋ฆฌ ๊ฐ์ฒด Promise๋?
1. ๋๊ธฐ ์ฒ๋ฆฌ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ
๋๊ธฐ๋ ์์ฐจ์ ์ผ๋ก ์ผ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด๋ฉฐ, ๋น๋๊ธฐ๋ ํ๊บผ๋ฒ์ ๋ง์ ์ผ์ ์ฒ๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋๋ค.
๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ๋ฉํฐ์ค๋ ๋๋ก ๋์ํ๋ค๊ณ ์๊ฐํ ์ ์์ง๋ง, ์ค์ ์ฑ๊ธ ์ฐ๋ ๋๋ก ๋์ํฉ๋๋ค.
์ดํด๋ฅผ ๋๊ธฐ ์ํด ๋๊ธฐ์ ๋น๋๊ธฐ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ ๋ฆฌํ์์ต๋๋ค. ์ฑ๊ธ ์ค๋ ๋๋ก ๋์ํ๋ ๋ฐฉ์์ ๋๋ค.
๋ค์ ๊ทธ๋ฆผ์์ ํ์ธํ ์ ์๋ฏ, ๋๊ธฐ ์ฒ๋ฆฌ๋ CPU๊ฐ Idle ์ํ๊ฐ ๋๋ฉด์ ์์์ ๋ญ๋นํ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๋ฐ๋ฉด, ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ CPU๊ฐ Idle์ํ์ ๋น ์ง์ง ์๊ฒ ํจ์ผ๋ก์จ ์์ ๋ญ๋น๋ฅผ ์ค์ ๋๋ค.
- ๋๊ธฐ:
- ์์ฐจ์ ์ผ๋ก ์ผ์ ์ฒ๋ฆฌ
- ํธ์ถ๋ถ์์ ์คํ ๊ฒฐ๊ณผ๊ฐ ๋ฆฌํด๋์ด์ผ ๋ค์ ์ผ์ ์ฒ๋ฆฌ ๊ฐ๋ฅ
- ๋น๋๊ธฐ:
- ๋ณ๋ ฌ์ ์ผ๋ก ์ผ์ ์ฒ๋ฆฌ
- ํ ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง ์์ ์ฒ๋ฆฌ
- ํธ์ถ๋ถ์ ์คํ๊ฒฐ๊ณผ๊ฐ ๋ฆฌํด๋์ง ์์๋ ๋ค์ ์ผ ์ฒ๋ฆฌ ๊ฐ๋ฅ
โ ๋๊ธฐ์ ๋น๋๊ธฐ๋ฅผ ๊ณต๋ถํ๋ค ๋ณด๋ฉด Blocking๊ณผ Non-blocking์ด๋ ์ฉ์ด๋ฅผ ๋ง๋๊ฒ ๋ฉ๋๋ค. ๋ธ๋กํน์ ๋๊ธฐ์ , ๋ ผ๋ธ๋กํน์ ๋น๋๊ธฐ์ ์ด๋ผ๊ณ ์คํดํ ์ ์์ต๋๋ค. ์ ์ด๊ถ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋๋์ ๋ฐ๋ผ Blocking๊ณผ Non-blocking์ผ๋ก ๊ตฌ๋ถํ ์ ์๋ค๋ ๊ฒ๋ง ์ ๋ ํ ๋ค, ์ด๋ ๋ค๋ฅธ ๊ฒ์๋ฌผ์์ ํ๋์ ์ฃผ์ ๋ก ๋ค๋ฃจ์ด ๋ณด๊ฒ ์ต๋๋ค.
2. ๋น๋๊ธฐ ์ฒ๋ฆฌ - ์ฝ๋ฐฑ ํจ์
JavaScript์์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฐฉ์์ ์ดํดํ๊ธฐ ์ํด์๋ ์ฝ๋ฐฑํจ์๋ฅผ ๋จผ์ ์ดํดํ์ฌ์ผ ํฉ๋๋ค. ์์ผ๋ก ๋น๋๊ธฐ์ฒ๋ฆฌ๋ฐฉ์ ์ค Promise
์ async-await
์ ๋ํด ์์๋ณผ ๊ฒ์ธ๋ฐ ์ด๋, ์ฝ๋ฐฑ ํจ์ ๊ฐ๋
์ด ์ ์กํ์์ง ์๋ค๋ฉด ๋ ๋ฐฉ์์ ์ดํดํ๋ ๋ฐ ํผ๋์ค๋ฌ์ธ ์ ์์ต๋๋ค.
1) ์ฝ๋ฐฑํจ์
- ๋์ค์ ํธ์ถ๋ ํจ์
- ์ด๋ค ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ํน์ ์์ ์ ๋๋ฌํ์ ๋ ์์คํ ์ด ํธ์ถํ๋ ํจ์
const greeting = (name, callback) => {
console.log(`Hello! ${name}`);
callback();
}
const callback_function = () => {
console.log("์ฝ๋ฐฑํจ์๊ฐ ํธ์ถ๋์์ต๋๋ค.");
}
// ์ธ์๊ฐ์ผ๋ก Edlin์ ์ฃผ๊ณ greeting ํจ์๊ฐ ํธ์ถ๋๋ฉด, callback_function ํจ์๋ฅผ ํธ์ถํด์ค.
greeting("Edlin", callback_function);
// Hello! Edlin
// ์ฝ๋ฐฑํจ์๊ฐ ํธ์ถ๋์์ต๋๋ค.
const greeting = (name, callback) => {
console.log(`Hello! ${name}`);
callback();
}
// ์ธ์๊ฐ์ผ๋ก Edlin์ ์ฃผ๊ณ greeting ํจ์๊ฐ ํธ์ถ๋๋ฉด, ์ต๋ช
ํจ์๋ฅผ ํธ์ถํด์ค.
greeting("Edlin", function() {
console.log("์ฝ๋ฐฑํจ์๊ฐ ํธ์ถ๋์์ต๋๋ค.");
});
// Hello! Edlin
// ์ฝ๋ฐฑํจ์๊ฐ ํธ์ถ๋์์ต๋๋ค.
2) ๋น๋๊ธฐ ์ฒ๋ฆฌ์์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ฌ์ฉํ๋ ์ด์
- ์๋ฒ์ ์์ฒญ์ ๋ณด๋์ ๋ ์ธ์ ์๋ต์ด ์ฌ์ง ์ ์ ์๊ธฐ ๋๋ฌธ์, ์ด๋ค ์์ ์ ๋๋ฌํ์ ๋ ํธ์ถ ๊ฐ๋ฅํ ์ฝ๋ฐฑํจ์๋ฅผ ์ฌ์ฉ
3) ๋ด์ฅ ๋น๋๊ธฐ ํจ์ setTimeout(function() {...}, miliseconds)
- ๋ค์ ์ฝ๋๋ฅผ ์คํํด๋ด ์๋ค. ์ฝ๋ฐฑ ํจ์๋ฅผ ์ฌ์ฉํ์ง ์์์ต๋๋ค.
function greeting(country) {
let result;
setTimeout(function () {
console.log("1์ด ํ ์คํ");
if (country === "Korea") result = "์๋
?";
else if (country === "America") result = "Hello";
}, 1000);
return result;
}
const result = greeting("Korea");
console.log("ํ๊ตญ์ด ์ธ์ฌ: ", result);
<์์ ๊ฒฐ๊ณผ>
1์ด ํ ์คํ
ํ๊ตญ์ด ์ธ์ฌ: ์๋
?
<์ค์ ๊ฒฐ๊ณผ>
setTimeout()
์ ๋น๋๊ธฐ ํจ์๋ก ๋๊ธฐ ํจ์์ฒ๋ผ ์์ฐจ์ ์คํ์ ๋ณด์ฅํ์ง ์์ต๋๋ค.- ํจ์์ ์คํ์ด ์๋ฃ๋๊ธฐ ์ ๋ค์ ๋ผ์ธ์ด ์คํ๋ ์ ์๋ค๋ ์ ์ ์ ์ํด์ผ ํฉ๋๋ค.
๐งก ๋น๋๊ธฐ ํจ์๋ฅผ ์คํํ ๊ฒฝ์ฐ line by line์ผ๋ก ์ฝ๋๊ฐ ์คํ๋์ด ๊ฒฐ๊ณผ๊ฐ ๋ฐํ๋์ง ์๋๋ค๋ ์ ์ ์ ์ํ์ธ์!
- ๋ค์ ์ฝ๋๋ฅผ ์คํํด๋ด ์๋ค. ์ฝ๋ฐฑ ํจ์๋ฅผ ์ฌ์ฉํ ์์ ๋๋ค.
function greeting(country, callback) {
let result;
setTimeout(function () {
console.log("1์ด ํ ์คํ");
if (country === "Korea") result = "์๋
?";
else if (country === "America") result = "Hello";
callback(result);
}, 1000);
}
greeting("Korea", function (result) {
console.log("ํ๊ตญ์ด ์ธ์ฌ: ", result);
});
3. ๋น๋๊ธฐ ์ฒ๋ฆฌ ๊ฐ์ฒด Promise
- ES6 ์ , ์ฝ๋ฐฑํจ์๋ฅผ ์ค์ฒฉํ์ฌ ์ฐ์์ ์ผ๋ก ํธ์ถ(์ฝ๋ฐฑ ์ง์ฅ) ํ์์ต๋๋ค.
- ES6 ํ, Promise๋ฅผ ์ฌ์ฉํ์ฌ ๋ถํธํจ์ ํด์ํ์์ต๋๋ค.
Promise์ ์ฌ์ ์ ์๋ฏธ:... ์ผ ๊ฒ ๊ฐ๋ค,... ์ ์กฐ์ง์ ๋ณด์ด๋ค.
" An indication of future success or improvement "
1) Promise ๋?
- ๋น๋๊ธฐ ์ฒ๋ฆฌ ์์ ์ ์๋ฃ์ ์คํจ์ ๊ฒฐ๊ณผ ๊ฐ์ ๋ํ๋ด๋ ๊ฐ์ฒด
- ๋น๋๊ธฐ ์ฐ์ฐ์ด ์ข ๋ฃ๋ ์ดํ์ ๊ฒฐ๊ณผ ๊ฐ์ ์ด์ฉํ์ฌ ๊ทธ ์ดํ์ ์ฒ๋ฆฌ๋ฅผ ๋ด๋นํ๋ ์ฒ๋ฆฌ๊ธฐ์ ์ฐ๊ฒฐ
- ๋น๋๊ธฐ๋ฅผ ๋ง์น ๋๊ธฐ ์์
์ฒ๋ผ ๋์ํ๊ฒ๋ ํ์ฌ ๊ฐ์ ๋ฐํํ ์ ์์ต๋๋ค.
- ์ฃผ์ํ ์ฌํญ์ ์ต์ข ๊ฒฐ๊ณผ๊ฐ ์๋, ๋ฏธ๋์ ์ด๋ค ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ๊ฒ ๋ค๋ ์ฝ์์ ๋ฐํํ๋ค๋ ๊ฒ์ ๋๋ค.
2) Promise.all(iterable)
- ์ฃผ์ด์ง ๋ชจ๋ ํ๋ก๋ฏธ์ค๋ฅผ ์ดํ ํน์ ํ ํ๋ก๋ฏธ์ค๊ฐ ๊ฑฐ๋ถ๋ ๋ ๋๊ธฐํ๋ ์๋ก์ด ํ๋ก๋ฏธ์ค ๋ฐํ
- iterable: ์ดํํ๊ณ ์ ํ๋ ํ๋ก๋ฏธ์ค์ ๊ฒฐ๊ณผ ๊ฐ์ ๊ฐ์ง ๋ฐฐ์ด
- values: ์ดํํ๊ณ ์ ํ๋ ํ๋ก๋ฏธ์ค๋ฅผ ๋ชจ๋ ์ดํํ์ฌ ๋ฐํ ๊ฐ์ ๊ฐ์ง๊ณ ์๋ค๋ฉด(์ฑ๊ณต), ๊ฐ๊ฐ์ ๋ฐํ ๊ฐ์ ๋ฐฐ์ด
- ์ดํํ๊ณ ์ ํ๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์คํจํ ๊ฒฝ์ฐ, ๋งค๊ฐ๋ณ์์ ํ๋ก๋ฏธ์ค ์ค ๊ฑฐ๋ถ๋ ์ฒซ ํ๋ก๋ฏธ์ค์ ์ฌ์ ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉ
// Promise.all() ์์
const promise1 = Promise.resolve(5);
const promise2 = 30;
const promise3 = new Promise((resolve, reject) => {
// Promise()์ ์ธ์๊ฐ์๋ ์ฒ๋ฆฌํ๊ณ ์ํ๋ ๋น๋๊ธฐ ๋ฉ์๋๊ฐ ๋ค์ด๊ฐ ์ ์๋ค.
setTimeout(resolve, 100, "hello");
});
// values: ๊ฐ Promise ์ฑ๊ณต ์ ๊ฐ์ง๋ ๊ฐ (๋ฐฐ์ด)
Promise.all([promise1, promise2, promise3]).then((values) => {
console.log(values); // (3) [3, 30, 'hello']
});
// iterable ๊ฐ์ฒด : Promise {<state>: "fulfilled", <value>: Array[3]}
let iterable_value = Promise.all([1, 2, 3]);
// ์คํจ ์ iterable ๊ฐ์ฒด : Promise{<state>: "rejected", <reason>: 555}
let itrable_value2 = Promise.all([1, 2, 3, Promise.reject(555)]);
3) Promise.allSettled(iterable)
- Promise.all() ๋ฉ์๋:
- ๋ฐํํ ํ๋ก๋ฏธ์ค๋ ์๋ก ์ฐ๊ด๋ ์์ ์ ์ํํ๊ฑฐ๋ ํ๋๋ผ๋ ๊ฑฐ๋ถ๋นํ์ ๋ ์ฆ์ ๊ฒฐ๊ณผ ๋ฐํ
- Promise.allSettled(iterable):
- ๋ฉ์๋๋ ์ฃผ์ด์ง ๋ชจ๋ ํ๋ก๋ฏธ์ค๋ฅผ ์ดํํ๊ฑฐ๋ ๊ฑฐ๋ถํ ํ, ๊ฐ ํ๋ก๋ฏธ์ค์ ๋ํ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ฒด ๋ฐฐ์ด๋ก ๋ฐํ
// Promise.allSettled() ์์
const promise1 = Promise.resolve(5);
const promise2 = 30;
Promise.allSettled([promise1, promise2]).then((results) => {
results.forEach((result) => console.log(result));
});
// {status: 'fulfilled', value: 5}
// {status: 'fulfilled', value: 30}
4) Promise.race(iterable)
- iterable ์์ ์๋ ํ๋ก๋ฏธ์ค ์ค์ ๊ฐ์ฅ ๋จผ์ ์๋ฃ๋ ๊ฒ์ ๊ฒฐ๊ด๊ฐ์ผ๋ก ๊ทธ๋๋ก ์ดํ ํน์ ๊ฑฐ๋ถ
// Promise.race() ์์
const promise1 = new Promise((resolve, reject) => {
setTimeout(resolve, 1, "called before promise2");
});
const promise2 = 30;
Promise.race([promise1, promise2]).then((result) => {
console.log(result); // 30
});
// promise1๊ณผ promise2 ๋ ๋ค ์คํ๋์ง๋ง, promise2๊ฐ ๋ ๋นจ๋๋ค.
5) Promise.resolve()
// Promise.resolve()
Promise.resolve(3).then((value) => {
console.log(value); // 3
});
6) Promise.reject(reason)
- reason type: String
// Promise.reject(reason)
Promise.reject("error")
.then()
.catch((value) => {
console.log(value);
});
4. ์ฌ์ฉ๋ฒ
- Promise๋ ํจ์์ ์ฝ๋ฐฑ์ ์ ๋ฌํ๋ ๋์ , ์ฝ๋ฐฑ์ ์ฒจ๋ถํ๋ ๋ฐฉ์์ ๊ฐ์ฒด
- ์ ๋ฐ์ค์ ๋ฌด์์ ์๋ฏธํ๋ ๊ฒ์ผ๊น์? ๋ฐฑ๋ฌธ์๋ถ์ฌ์ผํ! ์ฝ๋๋ก ์ดํดํด ๋ด ์๋ค.
- ๋ค์ ์์ ๋ mdn web docs๋ฅผ ์ฐธ๊ณ ํ ๋ด์ฉ์ ๋๋ค.
function successCallback(result) {
console.log(result);
}
function failureCallback(error) {
console.log(error);
}
// createAsync: ๋น๋๊ธฐ ์ฒ๋ฆฌ ํจ์์ ๊ฒฐ๊ณผ ๊ฐ์ Promise ๊ฐ์ฒด๋ก ๋ฐํ
// ์ฑ๊ณต ์ successCallback ์ฒจ๋ถ (์ฝ๋ฐฑ ์ง์ ์ ์ธ X)
// ์คํจ ์ failureCallback ์ฒจ๋ถ (์ฝ๋ฐฑ ์ง์ ์ ์ธ X)
createAsync(information_parameter).then(successCallback, failureCallback);
- ์์ ์ค๋ช ํ๋ Callback ํจ์์ ์๋ฅผ ์ดํด๋ด ์๋ค. ์ธ์๊ฐ๊ณผ ๋ณ๊ฐ๋ก ์ํํ ์ฝ๋ฐฑํจ์๋ฅผ ์ ์ธํด์ฃผ์์ต๋๋ค. ๊ทธ๋ฌ๋ Promise ๊ฐ์ฒด๋ callback์ ์ฒจ๋ถํ๋ ๋ฐฉ์์ ๊ฐ์ฒด์์ ํ์ธํ ์ ์์ต๋๋ค.
function greeting(country, callback) {
let result;
setTimeout(function () {
console.log("1์ด ํ ์คํ");
if (country === "Korea") result = "์๋
?";
else if (country === "America") result = "Hello";
callback(result);
}, 1000);
}
greeting("Korea", function (result) {
console.log("ํ๊ตญ์ด ์ธ์ฌ: ", result);
});
1) ๋ณด์ฅ
- ํ์ฌ ์คํ์ค์ธ ์ฝ ์คํ์ ์๋ฃํ๊ธฐ ์ด์ ์๋ ์ ๋ ํธ์ถ๋์ง ์์ต๋๋ค.
- โจ then์ ์ฌ๋ฌ๋ฒ ์ถ๊ฐํ์ฌ ์ฌ๋ฌ ๊ฐ์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. → chaining
2) Chaining
- ๋ ๊ฐ ์ด์์ ๋น๋๊ธฐ ์์ ์ ์์ฐจ์ ์ผ๋ก ์งํํ๊ณ ์ ํ ๋ Promise Chain์ ์ด์ฉํ ๊ฒฝ์ฐ ์ฝ๋ฐฑ์ง์ฅ์ ๋น ์ง์ง ์์ ์ ์์ต๋๋ค.
- then() ํจ์๋ ์๋ก์ด Promise ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
- ์ฝ๋ฐฑ ์ง์ฅ์ ์
firstThing(function(result) {
secondThing(result, function(result2){
thirdThing(result2, function(result3){
console.log(result3);
}, failureCallback);
}, failureCallback);
}, failureCallback);
- ES6 ์ดํ Promise ๊ฐ์ฒด ์ฌ์ฉํ์ฌ ๊ฐ์ ํ ์
// ์ถ์ฝํ ์
firstThing().then(function(result){
return secondThing(result);
}).then(function(result2){
return thirdThing(result2);
}).then(function(result3){
console.log(result3);
}).catch(failureCallback);
// ์ถ์ฝํ์ง ์์ ์
firstThing().then((result) => secondThing(result))
.then((result2) => thirdThing(result2))
.then((result3) => {
console.log(result3);
})
.catch(failureCallback);
- ํ chaining ์์ ์ด ์คํจํ๋๋ผ๋ ์ฐ์ํด์ ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
new Promise((resolve, reject) => {
console.log("Initial");
resolve();
})
.then(() => {
throw new Error("Something failed"); // error ๋ฐ์ - catch ์ํ
console.log("Do this");
})
.catch(() => {
console.log("Do that");
})
.then(() => {
console.log("Do this, whatever happened before");
});
3) ์ ๋ฆฌ
- ์ฝ๋ฐฑํจ์์์๋ ์์ฐจ์ ์ผ๋ก ๋น๋๊ธฐ์ฒ๋ฆฌ๋ฅผ ์ํํ ๊ฒฝ์ฐ, ์๋ฌ์ฒ๋ฆฌ๋ฅผ ๊ฐ๊ฐ ํด์ฃผ์์ต๋๋ค. (์ ์์ ์์ 3๋ฒ)
- Promise ๊ฐ์ฒด ์ฌ์ฉ ์, ์๋ฌ์ฒ๋ฆฌ๋ 1๋ฒ์ผ๋ก ์ค์ด๋ญ๋๋ค.
- Chaining ๋์ async/await๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์ง๊ด์ ์ด์ด์ ๋์ฑ ์ ํธ๋๋ ๋ฐฉ์์ ๋๋ค.
Promise์ ๋ด์ฉ์ด ๊ธธ์ด์ง๋ ๊ด๊ณ๋ก, ๋น๋๊ธฐ ์ฒ๋ฆฌ ํจ์ async / await๋ ๋ค์ ๊ธ์์ ์ด์ด ์ค๋ช ํ๊ฒ ์ต๋๋ค.
// Promise then์ ์ฌ์ฉํ Chaining
firstThing().then((result) => secondThing(result))
.then((result2) => thirdThing(result2))
.then((result3) => {
console.log(result3);
})
.catch(failureCallback);
// try...catch๋ฅผ ์ด์ฉํ Chaining
try{
const result = firstThing();
const result2 = secondThing(result);
const result3 = thirdThing(result2);
console.log(result3);
} catch(error) {
failureCallback(error);
}
// async/await ๊ตฌ๋ฌธ์ ์ด์ฉ
async function asyncFunction() {}
try{
const result = await firstThing();
const result2 = await secondThing(result);
const result3 = await thirdThing(result2);
console.log(result3);
} catch(error) {
failureCallback(error);
}
}
<์ฐธ๊ณ ์ฌ์ดํธ>
https://www.hanumoka.net/2018/10/24/javascript-20181024-javascript-callback/
Javascript - ์ฝ๋ฐฑํจ์(Callback function)์ด๋?
๋ค์ด๊ฐ๊ธฐCallback ํจ์๋ฅผ ๋ชจ๋ฅด์ง๋ ์๋๋ค. ํ์ง๋ง ์ ์๋ค๊ณ ๋งํ ์๋ ์๋ค.์์ฆ Node, Vue ๋ฑ์ ๊ณต๋ถํ๋ฉด์ callback ํจ์์ ์งํํ์ธ Promise, async ๋ฑ์ ์ ํ๊ณ ๊ณง ๋ฒฝ์ ๋งํ๋ค.์ด ๊ธ์ ํตํด Javascript cal
www.hanumoka.net
https://www.daleseo.com/js-async-callback/
[์๋ฐ์คํฌ๋ฆฝํธ] ๋น๋๊ธฐ ์ฒ๋ฆฌ 1๋ถ - Callback
Engineering Blog by Dale Seo
www.daleseo.com
https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Using_promises
Using promises - JavaScript | MDN
Promise๋ ๋น๋๊ธฐ ์์ ์ ์ต์ข ์๋ฃ ๋๋ ์คํจ๋ฅผ ๋ํ๋ด๋ ๊ฐ์ฒด์ ๋๋ค. ๋๋ถ๋ถ ์ฌ๋ฌ๋ถ์ ์ด๋ฏธ ๋ง๋ค์ด์ง promise๋ฅผ ์ฌ์ฉํ์๊ธฐ ๋๋ฌธ์ ์ด ๊ฐ์ด๋์์๋ ์ด๋ป๊ฒ promise๋ฅผ ๋ง๋๋์ง ์ค๋ช ํ๊ธฐ์ ์์
developer.mozilla.org
https://ko.javascript.info/async-await
async์ await
ko.javascript.info
๊น๋ํ๊ฒ ์ ๋ฆฌํ๋ ค ๋ ธ๋ ฅํ์๋๋ฐ, ์๋ชป๋ ์ ๋ณด๊ฐ ์์ ์ ์์ต๋๋ค.
๊ธ์ ์ฝ์ผ์๋ค ์๋ชป๋ ๋ถ๋ถ์ด ์๋ค๋ฉด ์๋ ค์ฃผ์ธ์.
๋ค์ ์ ๋ฆฌ๋ถํฐ๋ ์ ๋ฆฌ๋ด์ฉ์ ๊ฐ๋จํ ์ ๋ฆฌํ๊ธฐ ์ํด "...์ต๋๋ค." ๋์ "...๋ค."๋ก ๋ฌธ์ฅ์ ๋ง๋ฌด๋ฆฌ๋ฅผ ์ง๊ฒ ์ต๋๋ค.