Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Latest commit

ย 

History

History
142 lines (104 loc) ยท 4.69 KB

File metadata and controls

142 lines (104 loc) ยท 4.69 KB

๐Ÿ’ป async/await


๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป async/await ์ด๋ž€?

  • async/await๋Š” ES8(ECMAScript2017)์˜ ๊ณต์‹ ์ŠคํŽ™์œผ๋กœ ๋น„๊ต์  ์ตœ๊ทผ์— ์ •์˜๋œ ๋ฌธ๋ฒ•์ด๋‹ค.
  • async/await๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๋น„๊ต์  ์‰ฝ๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์— ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์ˆ˜์ ์ด๋‹ค.
  • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋Š” ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ์–ธ์ œ ๋ฐ˜ํ™˜๋ ์ง€ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ๋™๊ธฐ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๋ฒ•๋“ค์ด ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•œ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ setTimeout,Callback,Promise์ด๋‹ค.
  • ์œ„ 3๊ฐ€์ง€ ๊ธฐ๋ฒ•๋“ค๋„ ํ›Œ๋ฅญํ•˜์ง€๋งŒ ๋ฌธ์ œ์ ์ด ์กด์žฌํ•œ๋‹ค. async/await๋Š” ์ด๋ฅผ ํ•ด๊ฒฐํ•จ๊ณผ ๋™์‹œ์— ์‚ฌ์šฉ๋ฒ•์ด ๊ฐ„๋‹จํ•ด์กŒ๋‹ค.

๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป async ํ‚ค์›Œ๋“œ

  • 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 ํ‚ค์›Œ๋“œ

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” 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()๋ณด๋‹ค ์ข€ ๋” ์„ธ๋ จ๋˜๊ฒŒ ํ”„๋กœ๋ฏธ์Šค์˜ ๊ฒฐ๊ณผ ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป async/await ๊ธฐ๋ณธ ์˜ˆ์ œ

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 ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

  • 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/