- async/await๋
ES8(ECMAScript2017)์ ๊ณต์ ์คํ์ผ๋ก ๋น๊ต์ ์ต๊ทผ์ ์ ์๋ ๋ฌธ๋ฒ์ด๋ค. - async/await๋ฅผ ์ฌ์ฉํ๋ฉด ๋น๋๊ธฐ ์ฝ๋๋ฅผ ์์ฑํ ๋ ๋น๊ต์ ์ฝ๊ณ ๋ช ํํ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ๋
์ฑ๊ธ ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ด๊ธฐ ๋๋ฌธ์ ๋น๋๊ธฐ์ฒ๋ฆฌ๊ฐ ํ์์ ์ด๋ค. - ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ ๊ทธ ๊ฒฐ๊ณผ๊ฐ ์ธ์ ๋ฐํ๋ ์ง ์ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ๋๊ธฐ์์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฒ๋ค์ด ์ฌ์ฉ๋์ด์ผ ํ๋ค. ๋ํ์ ์ผ๋ก
setTimeout,Callback,Promise์ด๋ค. - ์ 3๊ฐ์ง ๊ธฐ๋ฒ๋ค๋ ํ๋ฅญํ์ง๋ง ๋ฌธ์ ์ ์ด ์กด์ฌํ๋ค. async/await๋ ์ด๋ฅผ ํด๊ฒฐํจ๊ณผ ๋์์ ์ฌ์ฉ๋ฒ์ด ๊ฐ๋จํด์ก๋ค.
- async ํค์๋๋ ํญ์ function ์์ ์์นํฉ๋๋ค.
async function f() {
return 1;
}
console.log(f()); // Promise { 1 }
console.log(f().then()); // Promise { <pending> }
f().then((res) => console.log(res)); //1- ๐ function ์์ async๋ฅผ ๋ถ์ด๋ฉด ํด๋น ํจ์๋ ํญ์ Promise๋ฅผ ๋ฐํํ๋ค.
- ๐ Promise๊ฐ ์๋ ๊ฐ์ ๋ฐํํ๋๋ผ๋
์ดํ ์ํ์ ํ๋ผ๋ฏธ์ค(resolved promise)๋ก ๊ฐ์ ๊ฐ์ธ ์ดํ๋ Promise๊ฐ ๋ฐํ๋๋๋ก ํ๋ค.
async function f() {
return Promise.resolve(1);
}
console.log(f()); // Promise { <pending> }
console.log(f().then()); // Promise { <pending> }
f().then((res) => console.log(res)); // 1- ์ ์ฝ๋์ ๊ฐ์ด ๋ช ์์ ์ผ๋ก Promise๋ฅผ ๋ฐํํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ฐ, ๊ฒฐ๊ณผ๋ ๊ฑฐ์ ๋์ผํ๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ๋ await ํค์๋๋ฅผ ๋ง๋๋ฉด Promise๊ฐ
์ฒ๋ฆฌ(Settled)๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค. ๊ฒฐ๊ณผ๋ ๊ทธ ์ดํ ๋ฐํ๋๋ค.
async function f() {
let promise = new Promise((resolve, reject) => {
setTimeout(() => resolve("์๋ฃ!"), 1000);
});
let result = await promise; // ํ๋ผ๋ฏธ์ค๊ฐ ์ดํ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆผ (*)
console.log(result); // "์๋ฃ!"
}
f();- ์ ์ฝ๋์์ ํจ์๋ฅผ ํธ์ถํ๊ณ , ํจ์ ๋ณธ๋ฌธ์ด ์คํ๋๋ ๋์ค์
(*)๋ก ํ์ํ ์ค์์ ์คํ์ด ์ ์์ค๋จ๋์๋ค๊ฐ Promise๊ฐ ์ฒ๋ฆฌ๋๋ฉด ์คํ์ด ์ฌ๊ฐ๋๋ค. - ์ด๋ ํ๋ผ๋ฏธ์ค ๊ฐ์ฒด์ ๊ฒฐ๊ณผ ๊ฐ์ด ๋ณ์ result์ ํ ๋น ๋๋ค. ๋ฐ๋ผ์ ์ ์ฝ๋๋ฅผ ์คํํ๋ฉด 1์ด ๋ค์
์๋ฃ!๊ฐ ์ถ๋ ฅ๋๋ค.
- ๐
await(๊ธฐ๋ค๋ฆฌ๋ค๋ผ๋ ๋ป์ ๊ฐ์ง ์๋จ์ด)๋ ๋ง ๊ทธ๋๋ก Promise๊ฐ ์ฒ๋ฆฌ๋ ๋๊น์ง ํจ์ ์คํ์ ๊ธฐ๋ค๋ฆฌ๊ฒ ๋ง๋ ๋ค. - Promise๊ฐ ์ฒ๋ฆฌ ๋๋ฉด ๊ทธ ๊ฒฐ๊ณผ์ ํจ๊ป ์คํ์ด ์ฌ๊ฐ๋๋ค. Promise๊ฐ ์ฒ๋ฆฌ๋๊ธธ ๊ธฐ๋ค๋ฆฌ๋ ๋์์
์์ง์ด ๋ค๋ฅธ ์ผ(๋ค๋ฅธ ์คํฌ๋ฆฝํธ ์คํ, ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ฑ)์ ํ ์ ์๊ธฐ ๋๋ฌธ์ CPU ๋ฆฌ์์ค๊ฐ ๋ญ๋น๋์ง ์๋๋ค. - await์
promise.then()๋ณด๋ค ์ข ๋ ์ธ๋ จ๋๊ฒ ํ๋ก๋ฏธ์ค์ ๊ฒฐ๊ณผ ๊ฐ์ ์ป์ ์ ์๋ค.
function fetchItems() {
return new Promise(function (resolve, reject) {
let items = [1, 2, 3];
resolve(items);
});
}
async function logItems() {
var resultItems = await fetchItems();
console.log(resultItems); // [1,2,3]
}
logItems();- fetchItems() ํจ์๋ Promise ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ํจ์์ด๋ค. (Promise๋
์๋ฐ์คํฌ๋ฆฝํธ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํ ๊ฐ์ฒด) - fetchItems() ํจ์๋ฅผ ์คํํ๋ฉด Promise๊ฐ ์ดํ(Resolved)๋๋ฉฐ ๊ฒฐ๊ณผ ๊ฐ์
items๋ฐฐ์ด์ด๋ค. - logItems() ํจ์๋ฅผ ์คํํ๋ฉด fetchItems() ํจ์์ ๊ฒฐ๊ณผ ๊ฐ์ธ
items๋ฐฐ์ด์ดresultItems๋ณ์์ ๋ด๊ธด๋ค. - ์ฌ๊ธฐ์ await์ ์ฌ์ฉํ์ง ์์๋ค๋ฉด ๋ฐ์ ์ฝ๋ ์ฒ๋ผ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์จ ์์ ์ ์ฝ์์ ์ถ๋ ฅํ ์ ์๊ฒ
์ฝ๋ฐฑ ํจ์๋.then()๋ฑ์ ์ฌ์ฉํด์ผ ํ๋ค.
function fetchItems() {
return new Promise(function (resolve, reject) {
let items = [1, 2, 3];
resolve(items);
});
}
function logItems() {
var resultItems = fetchItems();
resultItems.then((res) => console.log(res)); // [1,2,3]
}
logItems();- async/await์์ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์
try/catch์ด๋ค. - Promise์์ ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ์ํด
.catch()๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ฒ๋ผ async์์catch () { ... }๋ฅผ ์ฌ์ฉํ๋ค.
async function logTodoTitle() {
try {
const user = await fetchUser();
if (user.id === 1) {
const todo = await fetchTodo();
console.log(todo.title); // delectus aut autem
}
} catch (error) {
console.log(error);
}
}https://joshua1988.github.io/web-development/javascript/js-async-await/ https://ko.javascript.info/async-await https://blueshw.github.io/2018/02/27/async-await/