์žฅ์šฉ์„ ๋ธ”๋กœ๊ทธ
๋Œ์•„๊ฐ€๊ธฐ
29 min read
๐Ÿ‡บ๐Ÿ‡ธ EN
Promise.try(), ๊ทธ๋ฆฌ๊ณ  Torque๋ฅผ ๊ณ๋“ค์ธ
Promise.try(), ๊ทธ๋ฆฌ๊ณ  Torque๋ฅผ ๊ณ๋“ค์ธ
0:00 0:00

Promise.try๊ฐ€ ์ด์ œ ๊ธฐ์ค€์œผ๋กœ ์ƒˆ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ย |ย  Articles ย |ย  web.dev

์ด์ œ Promise.try๊ฐ€ ๋ชจ๋“  ์ฃผ์š” ๋ธŒ๋ผ์šฐ์ € ์—”์ง„์— ์ถœ์‹œ๋˜์–ด ๊ธฐ์ค€์„ ์ƒˆ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://web.dev/blog/promise-try-baseline?hl=ko
Promise.try๊ฐ€ ์ด์ œ ๊ธฐ์ค€์œผ๋กœ ์ƒˆ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ย |ย  Articles ย |ย  web.dev

Promise.try ์ด๊ฒƒ์ด ํ‘œ์ค€์œผ๋กœ ์˜ฌ๋ผ์™”๋‹ค๊ณ  ํ–ˆ์„๋•Œ, ์‚ดํŽด๋ดค์—ˆ์ง€๋งŒ. ๋ฌด์—‡์„ ์œ„ํ•œ ๊ฒƒ์ธ์ง€๋ฅผ ๋ฐ”๋กœ ์ดํ•ดํ•˜๊ธฐ๋Š” ์‰ฝ์ง€ ์•Š์•˜๋‹ค. ๋ถ„๋ช… ์–ด๋–ค ๋ชฉ์ ์„ ๊ฐ€์ง€๊ณ  ํƒ„์ƒํ–ˆ์„ํ…๋ฐโ€ฆ ์˜คํžˆ๋ ค ์—„์ฒญ๋‚œ ๊ธฐ๋Šฅ์ด๋ฉด ๋ชฐ๋ผ๋„, ์ด๋Ÿฐ ์†Œ์†Œํ•œ ๊ฒƒ์ด ์ถ”๊ฐ€๋œ ๊ฒƒ์—๋Š” ๋ถ„๋ช… ์Šคํ† ๋ฆฌ๊ฐ€ ์žˆ์„ ๊ฒƒ ๊ฐ™์•˜๋‹ค. ์„ค๋ น ๋Œ€๋‹จํ•œ ์ด์•ผ๊ธฐ๋Š” ์•„๋‹ˆ๋”๋ผ๋„. ์˜ค๋Š˜์€ ๊ณ ๊ณ ํ•™์ž๊ฐ€ ๋˜์–ด ์ด๋ฒˆ ๊ธฐํšŒ์— ๊ทธ ๊ธฐ์›๊ณผ ์ œ์•ˆ๊ณผ์ •, ๊ทธ๋ฆฌ๊ณ  ๊ตฌํ˜„์— ๋Œ€ํ•ด์„œ ๊ฐ™์ด ์‚ดํŽด๋ณด์ž.

Promise.try()

Promise.try

No description available

https://tc39.es/proposal-promise-try/#sec-promise.try

Promise์˜ ์ •์ ๋ฉ”์„œ๋“œ ๋ผ์ธ์—…์— ์ƒˆ๋กœ์ด ์ถ”๊ฐ€๋œ ๋ฉ”์„œ๋“œ์ด๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜์ž๋ฉด, Promise.try(fn, โ€ฆargs)๋Š” ์ฝœ๋ฐฑ fn์„ ์ฆ‰์‹œ(๋™๊ธฐ์ ์œผ๋กœ) ์‹คํ–‰ํ•œ ๋’ค ๊ฒฐ๊ณผ๋ฅผ ํ”„๋กœ๋ฏธ์Šค๋กœ ๊ฐ์‹ธ ๋Œ๋ ค์ค€๋‹ค. ๋ฌด์Šจ๋ง์ธ๊ฐ€ ํ•˜๋ฉด ์ด๋ ‡๋‹ค. ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด์ž.

๋™๊ธฐ์ผ ์ˆ˜๋„ ์žˆ๊ณ  ๋น„๋™๊ธฐ์ผ ์ˆ˜๋„ ์žˆ๋Š” ํ•จ์ˆ˜ f๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž. (async await ์€ ์ž ์‹œ ์ œ์ณ๋‘๊ณ )

function f() {
  // ๋™๊ธฐ์ผ์ˆ˜๋„ ์žˆ๊ณ  ๋น„๋™๊ธฐ ์ผ์ˆ˜๋„ ์žˆ๋‹ค.
  if (Math.random() < 0.5) {
    throw new Error("sync fail");
  }
  return Promise.reject(new Error("async fail"));
}

f๊ฐ€ ๋งŒ์•ฝ ๊ทธ๋ƒฅ ๋™๊ธฐ ํ•จ์ˆ˜ ์˜€๋‹ค๋ฉด ์—๋Ÿฌ๋ฅผ ์ด๋ ‡๊ฒŒ ์ฒ˜๋ฆฌํ–ˆ์„ ๊ฒƒ์ด๋‹ค.

try {
  f();
} catch (e) {
  console.log(e.message);
}

๋ฐ˜๋Œ€๋กœ f๊ฐ€ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์˜€๋‹ค๋ฉด ์ด๋ ‡๊ฒŒ ์ฒ˜๋ฆฌํ–ˆ์„ ๊ฒƒ์ด๋‹ค.

f().catch(console.log);

๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ f๊ฐ€ ๋™๊ธฐ์ผ ์ˆ˜๋„ ์žˆ๊ณ  ๋น„๋™๊ธฐ์ผ ์ˆ˜๋„ ์žˆ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ? ๋ญ ๊ทธ๋Ÿด ์ƒํ™ฉ์€ ๋งŽ์ด ์—†๊ฒ ์ง€๋งŒ ๋งŒ์•ฝ ์žˆ๋‹ค๋ฉด ์ด๋ ‡๊ฒŒ ํ•ด์•ผํ•  ๊ฒƒ์ด๋‹ค.

Promise.resolve().then(f).catch(console.log);

์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ์žˆ์„๊นŒ?
f์˜ ์‹คํ–‰์‹œ์ ์ด ๋‹ฌ๋ผ์ง€๊ฒŒ ๋œ๋‹ค. ์ด๋ฒคํŠธ๋ฃจํ”„์˜ ๋™์ž‘ ์ˆœ์„œ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž. Promise.resolve().then(f).catch(console.log) ์˜ ์‹คํ–‰ ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. Promise.resolve()๋Š” ์ด๋ฏธ fulfilled ์ƒํƒœ์ธ ํ”„๋ผ๋ฏธ์Šค๋ฅผ ์ฆ‰์‹œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  2. .then(f)๋Š” f๋ฅผ onFulfilled ํ•ธ๋“ค๋Ÿฌ๋กœ ๋“ฑ๋กํ•˜๊ณ , ํ•ด๋‹น Reaction Job์„ microtask ํ์— ๋„ฃ๋Š”๋‹ค.
  3. ํ˜„์žฌ ์ฝœ์Šคํƒ์ด ๋ชจ๋‘ ๋น„์›Œ์ง„ ๋’ค, ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ๊ทธ microtask๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉด์„œ f ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
  4. f๊ฐ€ ๋™๊ธฐ์ ์œผ๋กœ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋ฉด, ๊ทธ ์˜ˆ์™ธ๋Š” .then์ด ๋ฐ˜ํ™˜ํ•œ ์ƒˆ ํ”„๋ผ๋ฏธ์Šค์˜ reject ์ƒํƒœ๋กœ ๋ณ€ํ™˜๋˜๊ณ , ์ด์–ด์ง„ .catch๊ฐ€ ์ด๋ฅผ ๋ฐ›๋Š”๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ f๋Š” ๋‹ค์Œ tick์—์„œ ์‹คํ–‰๋˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋กœ์ธํ•ด ์ฝœ์Šคํƒ์ด ๋Š๊ธฐ๊ฒŒ ๋˜๊ณ , ์ด๋Š” ๋””๋ฒ„๊น…์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค๊ณ , ์˜ˆ์™ธ ์ „ํŒŒ๋„ ํ•œ ๋ฐ•์ž ๋Šฆ์–ด์ง„๋‹ค.

์ด๋•Œ Promise.try๊ฐ€ ์ด ๋ชจ๋“ ๊ฒƒ์„ ๋ฐ”๋กœ์žก๊ณ ์ž ๋“ฑ์žฅํ•˜๊ฒŒ ๋œ๋‹ค.

Promise.try(f).catch(console.log);

์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด Promise.try ์•ˆ์—์„œ f๋ฅผ ์ฆ‰์‹œ ์‹คํ–‰ํ•˜๊ณ  ๊ฐ’์ด๋ฉด resolve, throw ์ด๋ฉด reject๋กœ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค. ๋ฌผ๋ก  ๋น„๋™๊ธฐ์ด๋ฉด ๊ทธ๋Œ€๋กœ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค. ๋™๊ธฐ์ผ ๋•Œ์˜ ์ผ€์ด์Šค๋ฅผ ๋น„๋™๊ธฐ์™€ ๊ท ์ผํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ์šฉ๋„๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด f์˜ ์‹คํ–‰์‹œ์ ์ด ๋ฐ€๋ฆฌ์ง€๋„ ์•Š๊ณ , ๋™๊ธฐ์ธ ์—๋Ÿฌ๋ฅผ ๋งŒ๋‚  ๋•Œ์—๋„ ํ˜„์žฌ ์ฝœ์Šคํƒ์—์„œ ์‹คํ–‰,ํŠธ๋ ˆ์ด์Šค๊ฐ€ ๋Š๊ธฐ์ง€ ์•Š๋Š”๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์˜๋ฌธ์ด ๋“ค ์ˆ˜ ์žˆ๋‹ค.

โ€˜๋™๊ธฐ์ผ ์ˆ˜๋„ ์žˆ๊ณ  ๋น„๋™๊ธฐ์ผ ์ˆ˜๋„ ์žˆ๋Š” ์ผ€์ด์Šค๊ฐ€ ๋ญ๊ฐ€ ์žˆ์ง€?'
'async await๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด try catch๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€ ์•Š๋‚˜?โ€™

์šฐ์„  Promise ์˜ ํƒ€์ž„๋ผ์ธ์„ ์งง๊ฒŒ ํ›‘๊ณ  ๊ฐ€์ž.

ES6์—์„œ Promise ๊ฐ€ ๋“ฑ์žฅํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ ์ดํ›„ ES2017์—์„œ async await ๊ฐ€ ๋“ฑ์žฅํ•˜๊ฒŒ ๋œ๋‹ค.

๋‹น์‹ ์€ ์ด์ œ ์ € ์‚ฌ์ด, async await์ด ๋“ฑ์žฅํ•˜๊ธฐ ์ด์ „ ๊ฐœ๋ฐœ์ž๋ผ๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž.

ํŒŒ์ผ์„ ์ฝ์–ด์„œ json ํŒŒ์‹ฑํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํ•˜์ž. ์ด๋•Œ ํŒŒ์ผ์ด json ํŒŒ์ผ์ธ์ง€ ํ™•์ธํ•˜๊ณ , ๋งž์œผ๋ฉด ํŒŒ์‹ฑํ•˜๊ณ , ์•„๋‹ˆ๋ฉด ์—๋Ÿฌ๋ฅผ ๋˜์ง€๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑ ํ•ด๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

const fs = require("fs").promises;

const readFile = (file) => {
  if (!file.endsWith(".json")) {
    throw new Error("not json");
  }
  return fs.readFile(file, "utf8");
};

์ด ํ•จ์ˆ˜๋Š” ํŒŒ์ผ๋ช…์— ๋”ฐ๋ผ ๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๊ฑฐ๋‚˜ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค. ๊ทธ์— ๋”ฐ๋ผ ์œ„์—์„œ ์‚ดํŽด๋ดค๋˜๊ฒƒ ๊ณผ๊ฐ™์ด ์ฒ˜๋ฆฌํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋œ๋‹ค.

Promise.resolve()
  .then(() => readFile("some.json"))
  .then(JSON.parse)
  .catch(handleError);

์ฝ”๋“œ์˜ ์˜๋„๋ฅผ ํŒŒ์•…ํ•˜๋Š”๋ฐ ๋ถˆํ•„์š”ํ•œ ์š”์†Œ๋“ค์ด ๊ฐœ์ž…ํ•˜๊ฒŒ ๋˜๊ฒŒ๋œ๋‹ค. resolve์™€ then ์€ ๋‹จ์ง€ Promise๋กœ ๊ฐ์‹ธ์ฃผ๋Š” ์—ญํ• ๋งŒ ํ• ๋ฟ ์ผ์ข…์˜ ํŠธ๋ฆญ์ด๋‹ค.

๋‹น์‹œ์—๋„ ์ด๋Ÿฐ์‹์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ง€๊ธˆ์˜ Promise.try ์™€ ๊ฐ™์€ ํ˜•ํƒœ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ–ˆ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ Bluebird ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

Promise.try | bluebird

Bluebird is a fully featured JavaScript promises library with unmatched performance.

http://bluebirdjs.com/docs/api/promise.try.html
Bluebird.try(readJsonFile, "some.json").catch(handleError);

๊ตฌํ˜„์„ ์‚ดํŽด๋ณด๋ฉด throw๋œ ๊ฐ’์„ ๋‹ค์‹œ ํ”„๋กœ๋ฏธ์Šค๋กœ ๊ฐ์‹ธ์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค. (์ฝ”๋“œ๋Š” ์‚ด์ง ๊ฐ„์ถ”๋ ธ๋‹ค.)

// https://github.com/petkaantonov/bluebird/blob/master/src/method.js
Promise.attempt = Promise["try"] = function (fn) {
  var ret = new Promise(INTERNAL);
  ret._captureStackTrace();
  ret._pushContext();

// ๋™๊ธฐ ํ˜ธ์ถœ
var value = tryCatch(fn)();

// ๊ฒฐ๊ณผ๋ฅผ ํ”„๋กœ๋ฏธ์Šค๋กœ ๊ฐ์‹ธ์„œ ๋ฐ˜ํ™˜
ret.\_resolveFromSyncValue(value);
return ret;
};

์ด๋ ‡๊ฒŒ ๋ณด๋ฉด Promise.try ๋Š” ๊ฝค๋‚˜ ํš๊ธฐ์ ์ธ ํŽธ๋ฆฌํ•œ ๋ฉ”์„œ๋“œ๋กœ ๋ณด์ธ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ์œ„์™€ ๊ฐ™์€ ๋ถˆํŽธํ•จ์„ ๋А๊ปด๋ณธ์ ์ด ๋งŽ์€๊ฐ€? ๋‚˜๋Š” ๊ทธ๋ ‡๊ฒŒ ๋งŽ์ด ๋А๊ปด๋ณธ์ ์€ ์—†์—ˆ๋‹ค.

์™œ๋ƒํ•˜๋ฉด ์šฐ๋ฆฌ์—๊ฒ async await๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ async await ๋กœ ์ž‘์„ฑํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋œ๋‹ค.

const readJsonFile = async (file) => {
  if (!file.endsWith('.json')) {
    throw new Error('not json');
  }
  return fs.readFile(file, 'utf8');
}

const processJsonFile = async () => {
  try {
    const data = await readFile('some.json');
    return JSON.parse(data);
  } catch (e) {
    console.log(e.message);
  }
}

์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๋™๊ธฐ์ผ ๋•Œ์™€ ๋น„๋™๊ธฐ์ผ ๋•Œ ๋ชจ๋‘ ๋™์ผํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค๋ฅธ ์˜ˆ์‹œ๋กœ๋Š” copy๋„ ๋“ค์–ด๋ณผ ์ˆ˜ ์žˆ๊ฒ ๋Š”๋ฐ.

const copy = (text) => {
  return Promise.try(() => {
    if (navigator.clipboard) return navigator.clipboard.writeText(text);
    // ... some code for document.execCommand
    document.execCommand("copy");
  });
};

clipboard๊ฐ€ ์ง€์›๋˜๋Š”๊ฒฝ์šฐ๋Š” Promise๋ฅผ returnํ•˜๋Š” ๋ฉ”์„œ๋“œ์ธ navigator.clipboard.writeText ์„ ์‚ฌ์šฉํ•˜๊ณ , ์ง€์›๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋Š” ๋™๊ธฐ ๋ฉ”์„œ๋“œ์ธ document.execCommand ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋Ÿด๋•Œ ์จ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ async await ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋” ๊น”๋”ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

const copy = async (text) => {
  if (navigator.clipboard) {
    await navigator.clipboard.writeText(text);
  } else {
    // ... some code for document.execCommand
    document.execCommand("copy");
  }
};

๊ทธ๋ ‡๋‹ค๋ฉด ์™œ ์ด์ œ์•ผ Promise.try ๊ฐ€ ๋“ฑ์žฅํ–ˆ์„๊นŒ? ์œ„์—๋„ ์–ธ๊ธ‰ํ–ˆ์ง€๋งŒ Promise.try ๋Š” Promise์˜ ๋“ฑ์žฅ ์ดํ›„ ๊ทธ๋ฆฌ๊ณ  async await ๊ฐ€ ๋“ฑ์žฅํ•˜๊ธฐ ์ด์ „ ๊ทธ ์‚ฌ์ด์— ์ œ์•ˆ๋˜์—ˆ๋‹ค. [tc39]Proposal Promise-try์˜ ์ฒซ ์ปค๋ฐ‹์„ ์‚ดํŽด๋ณด๋ฉด 2016๋…„๋„์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜•ํƒœ์˜ ๊ตฌํ˜„์ฒด๋Š” ๊ทธ๋ณด๋‹ค ์ „๋ถ€ํ„ฐ ์žˆ์–ด์™”๋‹ค.

What is Promise.try, and why does it matter? - joepie91's Ramblings

No description available

http://cryto.net/~joepie91/blog/2016/05/11/what-is-promise-try-and-why-does-it-matter/

2016๋…„๋„์— ์ œ์•ˆ๋˜์—ˆ๋Š”๋ฐ ์™œ ์ด์ œ์•ผ ๋“ฑ์žฅํ–ˆ์„๊นŒ?

์น˜์—ดํ•œ ์„ค๋“

Promise.try๊ฐ€ 2016๋…„ ์ œ์•ˆ๋˜๊ณ  2024๋…„ ์ตœ์ข…์ ์œผ๋กœ Stage 4๋กœ ์Šน๊ฒฉ๋˜๊ณ  ๋ฐฐํฌ ๋˜๊ธฐ๊นŒ์ง€ ์–ด๋–ค ๊ณผ์ •๋“ค์ด ์žˆ์—ˆ๋Š”์ง€ ์‚ดํŽด๋ณด์ž.

Stage 1 - 2016.9~11

์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ Promise.try๋Š” 2016๋…„ Jordan Harband(https://github.com/ljharb)์— ์˜ํ•ด ์ œ์•ˆ๋˜์—ˆ๋‹ค.
2016๋…„ 9์›” ์ฒ˜์Œ Stage1๋กœ ์ œ์•ˆ๋˜์—ˆ์œผ๋‚˜, ๋‹น์‹œ ๋‹ค๋ฅธ ์•„์  ๋‹ค์— ๋ฐ€๋ ค์„œ ๋…ผ์˜๋˜์ง€ ๋ชปํ•˜๊ณ  ๊ทธํ•ด 11์›”์— ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋…ผ์˜ ๋˜์—ˆ๋‹ค.

proposal-promise-try/README.md at f2c8fdca4b09305a0c2dbcf16c1339b9d1ce8a58 ยท tc39/proposal-promise-try ยท GitHub

ECMAScript Proposal, specs, and reference implementation for Promise.try - proposal-promise-try/README.md at f2c8fdca4b09305a0c2dbcf16c1339b9d1ce8a58 ยท tc39/proposal-promise-try

https://github.com/tc39/proposal-promise-try/blob/f2c8fdca4b09305a0c2dbcf16c1339b9d1ce8a58/README.md
proposal-promise-try/README.md at f2c8fdca4b09305a0c2dbcf16c1339b9d1ce8a58 ยท tc39/proposal-promise-try ยท GitHub

๋‹น์‹œ์˜ ๊ทผ๊ฑฐ๋„ ์•„๊นŒ ์‚ดํŽด๋ณธ ์˜ˆ์‹œ๋Œ€๋กœ ์ƒ‰๊น”์„ ์•Œ์ง€ ๋ชปํ•˜๋Š” ํ•จ์ˆ˜๋“ค์— ๋Œ€ํ•ด์„œ ๋ถˆํ•„์š”ํ•œ syntax๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ์˜€๋‹ค.

์•„๋ž˜์˜ ๋ฏธํŒ…๋‚ด์—ญ์€ ๋‹น์‹œ ๋ฏธํŒ… ๊ธฐ๋ก์„ ๋ณด๊ธฐ ์ข‹๊ฒŒ ๋‹ค๋“ฌ์–ด ๋ณธ๊ฒƒ์ด๋‹ค.

2016๋…„ 11์›” 29์ผ TC39 ๋ฏธํŒ… ๋‚ด์—ญ - Promise.try ๋…ผ์˜ https://github.com/tc39/notes/blob/main/meetings/2016-11/nov-29.md#11iib-promisetry

JHD

์ด ๊ธฐ๋Šฅ์€ .then ํ˜ธ์ถœ ์ฒด์ธ์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ๊ฐ™์€ ํ‹ฑ(tick)์—์„œ ์‹คํ–‰ํ•˜๊ณ  Promise๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ์ ์—์„œ Promise.resolve().then()๊ณผ๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์žก ๋ฃจํ”„(job loop)์˜ ์‹œ๋งจํ‹ฑ์— ๋Œ€ํ•œ ๋…ผ์˜
JHD

์ด ๋ฐฉ์‹์€ ์ฆ‰์‹œ ํ˜ธ์ถœ๋˜๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜(immediately invoked async function)๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜, Promise ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋“ฑ์˜ ๋ฒˆ๊ฑฐ๋กœ์›€์„ ํ”ผํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

DD

์‚ฌ์šฉ์ž ๊ณต๊ฐ„(userspace) ์ฝ”๋“œ์—์„œ ์ •๋ง ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ํ•ญ์ƒ ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๊ณ , ๊ฒฐ์ •์ ์œผ๋กœ ๋ชจ๋“  ์˜ˆ์™ธ๋ฅผ ์žก์•„์„œ ๊ฑฐ๋ถ€๋œ Promise(rejected Promise)๋กœ ๋ฐ”๊ฟ”์ค๋‹ˆ๋‹ค.

MM

์ด๊ฒŒ ๋ชจํ˜ธํ•œ ์ ์€ ์—†๋‚˜์š”? ํ•ญ์ƒ ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๋‚˜์š”, ์•„๋‹ˆ๋ฉด ๋•Œ๋•Œ๋กœ ๊ทธ๋Ÿฐ๊ฐ€์š”?

JHD

ํ•ญ์ƒ ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

MM

์ด๋ ‡๊ฒŒ ์ฒ˜๋ฆฌ๋œ๋‹ค๋Š” ์ ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

JHD

๊ฑฐ์˜ ๋ชจ๋“  Promise ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ด ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

DD

๋™๊ธฐ ๋ถ€์—ฌ๋ฅผ ์œ„ํ•œ ์˜ˆ์‹œ: Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•  ๋•Œ, ์ด ํ•จ์ˆ˜๋Š” ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ๋ณธ๋ฌธ์„ Promise.try()๋กœ ๊ฐ์‹ธ๋ฉด, ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ด๋ฅผ ๊ฑฐ๋ถ€๋œ Promise๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์˜ฌ๋ฐ”๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function foo(relativeURL) {
  const absoluteURL = new URL(relativeURL, someBaseURL).href;

  return fetch(absoluteURL);
}

foo("http:0"); // ์˜ˆ์™ธ ๋ฐœ์ƒ!! ์ด๋Ÿฐ

function foo(relativeURL) {
  return Promise.try(() => {
    const absoluteURL = new URL(relativeURL, someBaseURL).href;

    return fetch(absoluteURL);
  });
}

function foo(relativeURL) {
  return (async () => {
    const absoluteURL = new URL(relativeURL, someBaseURL).href;

    return fetch(absoluteURL);
  })();
}

async function foo(relativeURL) {
  const absoluteURL = new URL(relativeURL, someBaseURL).href;

  return fetch(absoluteURL);
}

function foo(relativeURL) {
  return async do {
    // ?!?!?!
    var absoluteURL = new URL(relativeURL, someBaseURL).href;

    fetch(absoluteURL);
  };
}
YK

๋น„๋™๊ธฐ ํ•จ์ˆ˜(async functions)๊ฐ€ ์žˆ๋Š”๋ฐ, Promise.try๋Š” ๋ฐ˜์ชฝ์งœ๋ฆฌ ํ•ด๊ฒฐ์ฑ…์ผ ๋ฟ์ด์ง€ ์•Š๋‚˜์š”? ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ๋” ์‚ฌ์šฉํ•˜๊ธฐ ํŽธํ•˜์ง€ ์•Š์„๊นŒ์š”?

DD

์ œ ์ƒ๊ฐ์—๋Š” ์‹ค์ œ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ, ๊ทธ๋ƒฅ ์ผ๋ฐ˜์ ์ธ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ์“ฐ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ฆ‰์‹œ ํ˜ธ์ถœ๋˜๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋Š” ํ•„์š” ์—†์„ ๊ฒ๋‹ˆ๋‹ค.

JHD

์ด ์ œ์•ˆ์€, ํ•จ์ˆ˜ ์ž‘์„ฑ์ž๊ฐ€ ์‹ค์ˆ˜๋กœ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์ ˆ๋Œ€ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€์ง€ ์•Š๋„๋ก ๋ณด์žฅํ•˜์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ์š”.

JHD

์–ด๋–ค ์œ ์Šค์ผ€์ด์Šค์—์„œ๋Š” Promise๋ฅผ ๋‹ค๋ฃจ๋ฉด์„œ๋„ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿด ๋•Œ Promise.try๊ฐ€ ์ฆ‰์‹œ ํ˜ธ์ถœ๋˜๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ณด๋‹ค ๋” ํŽธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

KG

์˜ˆ๋ฅผ ๋“ค์–ด Promise ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ ๋“ฑ์ด ์žˆ๊ฒ ์ฃ .

JHD

๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ํ•ญ์ƒ ์›ํ•˜๋Š” ํ•ด๊ฒฐ์ฑ…์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ œ๊ฐ€ finally์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ ์ž‘์—…์„ ํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

YK

์ด๋Ÿฐ ํ™•์žฅ์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ทธ๋ƒฅ ๋ฐฐํฌํ•˜๋ฉด ์•ˆ ๋˜๋‚˜์š”?

JHD

ํด๋ฆฌํ•„(polyfill)์„ ๋ฐฐํฌํ–ˆ์ง€๋งŒ, ๊ฐœ๋ฐœ์ž๋“ค์€ ๋ชจ๋“  ๊ธฐ๋Šฅ์ด ํฌํ•จ๋œ ํ•˜๋‚˜๋ฅผ ์„ ํ˜ธํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

MM

์ „๋ฐ˜์ ์œผ๋กœ ์ด ๊ธฐ๋Šฅ์ด ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, Stage 1 ๊ธฐ์ค€์€ ์ถฉ์กฑํ•œ๋‹ค๊ณ  ๋ด…๋‹ˆ๋‹ค.

BT

๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•˜๋Š” ์ƒํ™ฉ์—์„œ, ๋‹น์‹ (MM)์„ ๋งŒ์กฑ์‹œํ‚ฌ ๋งŒํผ ์œ ์šฉํ•œ Promise API๊ฐ€ ์žˆ์„๊นŒ์š”?

YK

Promise.any์š”.

MM

Promise ํŒŒ์ดํ”„๋ผ์ด๋‹์„ ์œ„ํ•œ Promise.post/send/get ๋“ฑ์ด์š”.

BT

ํ•˜์ง€๋งŒ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋“ค์€ ์–ด๋–ค๊ฐ€์š”?

MM

์ œ๊ฐ€ ํฌ๊ด„์ ์œผ๋กœ ๋งํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋Š” ๊ธฐ์ค€์„ ๋งค์šฐ ๋†’์˜€์Šต๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ํ•จ์ˆ˜์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ ๊ฐ•๋ ฅํ•œ ๊ทผ๊ฑฐ๊ฐ€ ์žˆ๊ณ  ๋งŽ์€ ๊ฐ€์น˜๋ฅผ ๋”ํ•ด์•ผ ํ•  ๊ฒ๋‹ˆ๋‹ค.

JHD

ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ(transpiler)์™€ ์ƒ๊ด€์—†์ด, ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•˜๋Š” ๋ฐ๋Š” ์žฅ๋ฒฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋Š” ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ธฐ๋Šฅ๋ณด๋‹ค ๋„์ž…ํ•˜๊ธฐ ๋” ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €ํฌ AirBnB์—์„œ๋Š” regenerator ์˜์กด์„ฑ์„ ์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

AR

์‚ฌ๋žŒ๋“ค์ด Promise๋‚˜ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์™€ ๊ฐ™์ด ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ๊ณตํ†ต ๊ธฐ๋ฐ˜ ์œ„์—์„œ ์ ์ง„์ ์œผ๋กœ ์ฑ„ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

JHD

new Promise๋Š” ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

YK

์ œ๊ฐ€ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ํ•  ๋•Œ, ํ•ญ์ƒ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋งŒ ์“ฐ๊ณ  ์‹ถ์ง€ ์•Š์€ ๊ฒฝ์šฐ๋ฅผ ์ฐพ๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ธ์ง€์  ๋ถ€๋‹ด(cognitive overhead)๋„ ํ›จ์”ฌ ์ ์Šต๋‹ˆ๋‹ค.

์‹œ๊ฐ„ ์ œํ•œ ์•Œ๋ฆผ
JHD

Stage 1์œผ๋กœ ๊ฐˆ๊นŒ์š”?

WH

Stage 1์— ๋ฐ˜๋Œ€ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ, ์œ ์šฉ์„ฑ์— ๋Œ€ํ•ด์„œ๋Š” ํ™•์‹ ์ด ์—†์Šต๋‹ˆ๋‹ค.

JHD

์œ ์šฉ์„ฑ์— ๋Œ€ํ•œ ์šฐ๋ ค ๋•Œ๋ฌธ์— Stage 2๋Š” ์•„์ง ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์„ค๋“์„ ์œ„ํ•ด ๋ฌด์—‡์ด ํ•„์š”ํ• ๊นŒ์š”?

MM

์ฐฌ์„ฑ ๋…ผ๊ฑฐ: ์ด ์ œ์•ˆ์€ ๋ฌธ๋ฒ•(syntax)๊ณผ ์œ ์‚ฌํ•˜๋ฉฐ, ์ง๊ต์„ฑ(orthogonality) ์ธก๋ฉด์—์„œ ๊ธฐ๋Œ€๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ธ์ง€์  ๋ถ€๋‹ด์„ ๋Š˜๋ฆฌ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์˜คํžˆ๋ ค ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

BT

try๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์˜ ์ฝ”๋“œ๋ฒ ์ด์Šค, ์ฆ‰ ํ‘œ์ค€ Promise๊ฐ€ ์•„์ง ์ค€๋น„๋˜์ง€ ์•Š์•˜๋‹ค๊ณ  ๋งํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์˜ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์‚ดํŽด๋ด…์‹œ๋‹ค.

๊ฒฐ๋ก 
๊ฒฐ๋ก /๊ฒฐ์ •
TC39
  • Stage 1 ์Šน์ธ.
  • ๋™๊ธฐ ๋ถ€์—ฌ์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ฆ๊ฑฐ๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ Stage 2๋Š” ์•„์ง ์ค€๋น„๋˜์ง€ ์•Š์Œ.

์šฐ๋ฆฌ๊ฐ€ ์œ„์—์„œ ์‚ดํŽด๋ดค๋˜ ๊ฒƒ ์ฒ˜๋Ÿผ ํ•ด๋‹น ๋ฏธํŒ…์—์„œ๋„ Promise.try๊ฐ€ ํ•„์š”ํ•œ ์ผ€์ด์Šค์— ๋Œ€ํ•œ ์˜๋ฌธ์ด ๊ฐ•ํ•˜๊ฒŒ ์ œ๊ธฐ๋˜์—ˆ๋‹ค.
๊ทธ๋ ‡๊ฒŒ ์ผ๋‹จ Stage 1์— ๋จธ๋ฌธ์ฑ„๋กœ ์‹œ๊ฐ„์€ ํ˜๋Ÿฌ 8๋…„์˜ ์‹œ๊ฐ„์ด ํ˜๋ €๋‹ค.

Stage 2 - 2024.2

2024๋…„ 2์›” ๊ธด ์‹œ๊ฐ„ ๋์— Promise.try์— ๋Œ€ํ•œ Stage 2 ๋…ผ์˜๊ฐ€ ์‹œ์ž‘๋˜์—ˆ๋‹ค.

2024๋…„ 2์›” 6์ผ TC39 ๋ฏธํŒ… ๋‚ด์—ญ - Promise.try 2๋‹จ๊ณ„ ๋…ผ์˜ https://github.com/tc39/notes/blob/main/meetings/2024-02/feb-6.md#promisetry-for-stage-2

Promise.try 2๋‹จ๊ณ„ ์ง„์ž… ์ œ์•ˆ - ๋ฐœํ‘œ์ž: Jordan Harband (JHD)
JHD

์•„์ฃผ ์˜ค๋ž˜์ „, 2016๋…„์— ์ œ๊ฐ€ Promise.try๋ฅผ ์ œ์•ˆํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์•„์ด๋””์–ด๋Š” ์ด๋ ‡์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๊ฒŒ ๋™๊ธฐ์‹์ด๋“  ๋น„๋™๊ธฐ์‹์ด๋“ , ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋“  ์•ˆ ํ•˜๋“ , ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋“  ์•ˆ ๋˜์ง€๋“  ์‹ ๊ฒฝ ์“ฐ๊ณ  ์‹ถ์ง€ ์•Š์ง€๋งŒ, ์ด๊ฑธ ํ”„๋กœ๋ฏธ์Šค๋กœ ๊ฐ์‹ธ๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฑฐ์ฃ . ๊ทธ๋ž˜์„œ ๋งŒ์•ฝ ์˜ˆ์™ธ๋ฅผ ๋˜์ง„๋‹ค๋ฉด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋„๋ก ํ•˜๋Š” ๊ฒ๋‹ˆ๋‹ค.

JHD

์‰ฝ๊ฒŒ ๊ธฐ์–ตํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๊ธฐ ์žˆ์Šต๋‹ˆ๋‹ค. Promise.resolve ๋‹ค์Œ์— .then ์•ˆ์—์„œ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฑฐ์ฃ . ์ด๊ฑด ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ, ์›์น˜ ์•Š์„ ๋•Œ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์ตœ์‹  ๋ฐฉ์‹์€ ์ฆ‰์‹œ ์‹คํ–‰ ๋น„๋™๊ธฐ ํ•จ์ˆ˜(IIAFE)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ธ๋ฐ, ์—ฌ๊ธฐ์„œ ํ•จ์ˆ˜๋ฅผ awaitํ•˜๋ฉด ์‹ค์ œ๋กœ ์›ํ•˜๋Š” ์‹œ๋งจํ‹ฑ(์˜๋ฏธ ๋™์ž‘)์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

JHD

์ œ๊ฐ€ ์ด ๋ฐœํ‘œ๋ฅผ ํ–ˆ์„ ๋‹น์‹œ, ์ผ๋ฐ˜์ ์ธ ๋ฐ˜์‘์€ 2๋‹จ๊ณ„๋กœ ๊ฐ€๋ ค๋ฉด ์œ ์šฉ์„ฑ์— ๋Œ€ํ•ด ๋” ์„ค๋“๋ ฅ ์žˆ๋Š” ๊ทผ๊ฑฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. await ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ–ˆ์„ ๋•Œ ๋ง์ด์ฃ .

๊ทธ ๋‹น์‹œ์—๋Š” ์ด ์ œ์•ˆ์˜ ์œ ์ €๋žœ๋“œ(์‚ฌ์šฉ์ž ์˜์—ญ) ๋ฒ„์ „๋“ค์ด ๊ทธ๋ƒฅ์ €๋ƒฅ ์“ฐ์ด๋Š” ์ •๋„์˜€๊ณ , ์ œ ์ƒ๊ฐ์— ์ผ๋ฐ˜์ ์ธ ๊ธฐ๋Œ€, ํ˜น์€ ์ตœ์†Œํ•œ์˜ ํฌ๋ง์€ ์•„๋ฌด๋„ ์ด ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๊ณ  ๋ฌธ๋ฒ•๋งŒ์œผ๋กœ ์ถฉ๋ถ„ํ•  ๊ฒƒ์ด๋ผ๋Š” ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ทธ ์ดํ›„ 2๋…„์ด ์ง€๋‚˜ ์ด ํŒจํ‚ค์ง€๊ฐ€ ๊ณต๊ฐœ๋˜์—ˆ๊ณ , ์ฃผ๋‹น 4600๋งŒ ๋‹ค์šด๋กœ๋“œ๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์ด ๊ทธ๋ž˜ํ”„๋Š” ๊ณ„์† ์ƒ์Šนํ•˜๊ณ  ์žˆ๊ณ , ๋ช‡๋ช‡ NPM ๋ฐ์ดํ„ฐ ์˜ค๋ฅ˜๋ฅผ ์ œ์™ธํ•˜๋ฉด ์ฃผ๋‹น 4500๋งŒ ๋‹ค์šด๋กœ๋“œ๋กœ ์•ˆ์ •์ ์ž…๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ์–ด๋А ์ •๋„ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฑฐ์ฃ .

๋ฌผ๋ก  ์ด๊ฑด ํ•˜๋‚˜์˜ ํŒจํ‚ค์ง€๊ณ , ํ•œ ๋ช…์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งŒ๋“  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ฐœ๋ฐœ์ž๋Š” ๋‹ค๋ฅธ ๋งŽ์€ ํŒจํ‚ค์ง€๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋‹ˆ, ์–ด์ฉŒ๋ฉด ์‚ฌ์šฉ๋Ÿ‰์ด ๋งŽ์€ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€ ์ค‘ ํ•˜๋‚˜์— ์ด๊ฑธ ํฌํ•จ์‹œ์ผฐ๊ธฐ ๋•Œ๋ฌธ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ์ €๋Š” ์—ฌ์ „ํžˆ ์ด ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ๋А๋‚๋‹ˆ๋‹ค.

์ œ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ์—ฌ๊ธฐ ์žˆ๋Š” new Promise ์ฝ”๋“œ ์กฐ๊ฐ์ž…๋‹ˆ๋‹ค. new Promise ์‹คํ–‰์ž(executor) ์•ˆ์—์„œ resolve์— ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฑฐ์ฃ . ์ž‘๋™์€ ํ•˜์ง€๋งŒ, ๋ณด๊ธฐ ์•ˆ ์ข‹๊ณ , ์‹ค์ˆ˜ํ•˜๊ธฐ ์‰ฌ์šฐ๋ฉฐ, ์ฒ˜์Œ ์ ‘ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

์ด ํŒจํ‚ค์ง€๋ฅผ ์ฐพ์•„๋ณด๊ณ  ํ˜„์žฌ ๋งค์šฐ ๋งŽ์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๊ธฐ์—, ๋‹ค์‹œ ํ•œ๋ฒˆ ์ด ์ œ์•ˆ์„ ๊ฐ€์ ธ์™€ 2๋‹จ๊ณ„๋ฅผ ์š”์ฒญํ•˜๊ฑฐ๋‚˜, ์œ„์›ํšŒ๊ฐ€ 2๋‹จ๊ณ„ ์ž๊ฒฉ์„ ๊ฐ–์ถ”๊ธฐ ์œ„ํ•ด ๋ฌด์—‡์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ๋ณด๋Š”์ง€์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ๋‹ต๋ณ€์„ ์–ป๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒ์ž…๋‹ˆ๋‹ค.

NCL

๋„ค. ์ œ๊ฐ€ ์˜ฌ๋ฆฐ ์ฃผ์ œ์ธ๋ฐ, ์•„๋งˆ ๋ช…ํ™•ํ•œ ์งˆ๋ฌธ์ด ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์™œ ํ•„์š”ํ•œ์ง€๋ฅผ ๋ณด์—ฌ์ค„ ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค๋งŒ, ์ด ๊ฒฝ์šฐ์— ์ •๋ง ํ•„์š”ํ•œ๊ฐ€์š”? ๊ทธ๋ƒฅ value = await synchronousfunction()์„ ํ•˜๋ฉด ์•ˆ ๋˜๋‚˜์š”? ๋˜‘๊ฐ™์ด ์ž‘๋™ํ•˜์ง€ ์•Š์„๊นŒ์š”?

JHD

์ด ํŠน์ • ์ฝ”๋“œ ์กฐ๊ฐ์—์„œ๋Š” ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์ตœ์ƒ์œ„ await๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด ๋˜‘๊ฐ™์ด ์ž‘๋™ํ•  ๊ฒ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ชฉํ‘œ๊ฐ€ ํ”„๋กœ๋ฏธ์Šค ์กฐํ•ฉ๊ธฐ(combinator)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์–ป๋Š” ๊ฒƒ์ด๋ผ๋ฉด, ๊ทธ๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•ญ์ƒ ํ”„๋กœ๋ฏธ์Šค ์ž์ฒด๊ฐ€ ํ•„์š”ํ•˜๊ณ  await๋œ ๊ฐ’์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋ฉฐ, ๋ฐ”๋กœ ์ด๋•Œ Promise.try๊ฐ€ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ๊ฐ€ ๋น„์—ˆ์Šต๋‹ˆ๋‹ค.
JHD

ํ๊ฐ€ ๋น„์—ˆ๋‹ค๋ฉด, 2๋‹จ๊ณ„๋ฅผ ์š”์ฒญํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ŠคํŽ™์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. [์ŠคํŽ™ ๋งํฌ ๋ณด์—ฌ์ฃผ๋ฉฐ] ์ด๊ฒŒ ์ „๋ถ€์ž…๋‹ˆ๋‹ค. ์ตœ๊ทผ์— ์ตœ์‹  ๋ฒ„์ „์˜ ์ŠคํŽ™์— ๋งž์ถฐ ๋ฆฌ๋ฒ ์ด์Šคํ–ˆ์Šต๋‹ˆ๋‹ค.

KG

๋„ค. ์ €๋Š” ์—ฌ์ „ํžˆ ์ด๊ฒŒ ์™œ ํ•„์š”ํ•œ์ง€ ์ดํ•ด๊ฐ€ ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์™œ ํ•„์š”ํ•œ์ง€ ์ข€ ๋” ์„ค๋ช…ํ•ด์ฃผ์‹ค ์ˆ˜ ์žˆ๋‚˜์š”?

JHD

๋„ค. ํŠนํžˆ ์ œ๊ฐ€ API๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. API ์‚ฌ์šฉ์ž๊ฐ€ ์ €์—๊ฒŒ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๊ณ , ์ œ๊ฐ€ NCL์—๊ฒŒ ๋‹ต๋ณ€ํ•  ๋•Œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด, ๊ทธ๊ฒƒ์œผ๋กœ๋ถ€ํ„ฐ ๋ณธ์งˆ์ ์œผ๋กœ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ƒ์„ฑํ•œ ๋‹ค์Œ ์ถ”๊ฐ€ ์ž‘์—…์„ ํ•˜๊ณ  ์‹ถ์„ ๋•Œ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค๋ฅธ ๊ฒƒ๊ณผ ๊ฒฝ์Ÿ์‹œํ‚ค๊ฑฐ๋‚˜(race), Promise.all์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ์ถ”๊ฐ€ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๊ฒ ์ฃ . ์–ด๋А ์‹œ์ ์—์„œ๋Š” await ๊ตฌ๋ฌธ์ด ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์„ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋˜๊ฒ ์ง€๋งŒ, ์ดˆ๊ธฐ ์„ค์ • ๋‹จ๊ณ„์—์„œ๋Š” ์ œ ๋งŽ์€ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ํ”„๋กœ๋ฏธ์Šค๋กœ ์ž‘์—…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋‹ˆ ์ด๊ฑด ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‹จ์ง€ ์ œ๊ฐ€ ๊ฐ€๋” ํ•ด์•ผ ํ•˜๋Š” ์ผ์„ ์ข€ ๋” ์ง๊ด€์ ์ด๊ณ  ์šฐ์•„ํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

KG

๊ตฌ์ฒด์ ์œผ๋กœ, API๊ฐ€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋ฐ›๋Š”๋ฐ, ์‚ฌ์šฉ์ž๊ฐ€ ๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜๋„ ์žˆ๊ณ , ๊ทธ ํ•จ์ˆ˜๊ฐ€ ๋™๊ธฐ์ ์œผ๋กœ ์˜ˆ์™ธ๋ฅผ ๋˜์งˆ ์ˆ˜๋„ ์žˆ๋Š” ์ƒํ™ฉ์„ ๋ง์”€ํ•˜์‹œ๋Š” ๊ฑด๊ฐ€์š”?

JHD

๋„ค, ์‚ฌ์šฉ์ž๊ฐ€ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋Š”๋ฐ, ์ €๋Š” ๊ทธ๊ฒŒ ๋™๊ธฐ์ธ์ง€ ๋น„๋™๊ธฐ์ธ์ง€, ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋Š”์ง€ ์•„๋‹Œ์ง€ ํ™•์‹คํžˆ ๋ชจ๋ฅด๋Š”, ์†Œ์œ„ โ€œ์ƒ‰๊น”โ€(color)์„ ๋ชจ๋ฅด๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‹ ๊ฒฝ ์“ฐ๊ณ  ์‹ถ์ง€๋„ ์•Š๊ณ ์š”. ๊ทธ๋ƒฅ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ›์•„์„œ ์ตœ์„ ์„ ๋‹คํ•ด ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

KG

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค.

JRL

์ €ํฌ๊ฐ€ AMP์—์„œ ๊ฒช์—ˆ๋˜ ๋˜ ๋‹ค๋ฅธ ์‚ฌ๋ก€(ampproject/amphtml#15107)๋Š” ๋น„๋™๊ธฐ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์˜€์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๊ฐ€ ํ”„๋กœ๋ฏธ์Šค๋กœ ๋ž˜ํ•‘๋˜๋ฉด ๋ชจ๋“  ๊ฒƒ์„ ์ œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ฝ”๋“œ ๋ณ€๊ฒฝ ๋•Œ๋ฌธ์— Promise.resolve๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ, ๊ทธ ํ•จ์ˆ˜ ์ž์ฒด๊ฐ€ ๋™๊ธฐ์ ์œผ๋กœ ์˜ค๋ฅ˜๋ฅผ ๋˜์กŒ์Šต๋‹ˆ๋‹ค. ์ €ํฌ๋Š” ๋™๊ธฐ์  catch ์ฒ˜๋ฆฌ๊ฐ€ ์—†๊ณ  ํ”„๋กœ๋ฏธ์Šค ์ฒด์ธ์˜ ๋น„๋™๊ธฐ catch๋งŒ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ด ๊ฒฝ์šฐ๋ฅผ ์ œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ €ํฌ ๊ฐœ๋ฐœ์ž๋“ค์€ ๊ทธ ์ฐจ์ด๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ๊ณ , ํ”„๋กœ๋ฏธ์Šค์— ์˜ํ•ด ์žกํ˜€์„œ ๋น„๋™๊ธฐ ํ”„๋กœ๋ฏธ์Šค ์ฒ˜๋ฆฌ ๋กœ์ง์—์„œ ์ฒ˜๋ฆฌ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €ํฌ๋Š” Promise.resolve(fn())๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์— ์ €ํฌ ๋ฒ„์ „์˜ promise.try๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์ œํ–ˆ๊ณ , ์ด๊ฒƒ์ด ๋ฒ„๊ทธ๋ฅผ ํ•ด๊ฒฐํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ดํ›„๋กœ๋Š” ๋น„๋™๊ธฐ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์— ์•ˆ์‹ฌํ•˜๊ณ  ์˜์กดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

SYG

์‚ฌ์šฉ์ž ๊ณต๊ฐ„(userspace) ์ฝ”๋“œ์—์„œ ์ •๋ง ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ํ•ญ์ƒ ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๊ณ , ๊ฒฐ์ •์ ์œผ๋กœ ๋ชจ๋“  ์˜ˆ์™ธ๋ฅผ ์žก์•„์„œ ๊ฑฐ๋ถ€๋œ Promise(rejected Promise)๋กœ ๋ฐ”๊ฟ”์ค๋‹ˆ๋‹ค.

EAD

๊ทธ ์ ์— ๋Œ€ํ•œ ํ•œ ๊ฐ€์ง€ ํฌ์ธํŠธ๋Š” NPM ๋‹ค์šด๋กœ๋“œ ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ฃผ๋‹น 4600๋งŒ ๋‹ค์šด๋กœ๋“œ๊ฐ€ ์–ด๋””๋กœ ๊ฐ€๋Š”์ง€ ์•„๋Š” ๊ฒƒ์ด ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋น„๋ก ๊ทธ๊ฒƒ์ด ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ฃผ ์ปจํ…Œ์ด๋„ˆ์— ์‹ธ์—ฌ ์žˆ๋”๋ผ๋„, ๊ทธ๊ฒƒ๋“ค์ด ์‚ฌ์šฉ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ฌด์—‡์ด๊ณ , ๋ฌด์—‡์ดโ€ฆ 4600๋งŒ์€ ์—„์ฒญ๋‚œ ์ˆซ์ž์ž…๋‹ˆ๋‹ค! ๋ฌด์–ธ๊ฐ€๊ฐ€ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๊ทธ๊ฒŒ ๋ฌด์—‡์ผ๊นŒ์š”?

JHD

์ €๋Š” ์˜ค๋žซ๋™์•ˆ ์œ„์›ํšŒ๋ฅผ ์œ„ํ•ด ๋ฐ”๋กœ ๊ทธ ์งˆ๋ฌธ์— ๋‹ตํ•˜๊ธฐ ์œ„ํ•ด ํŒจํ‚ค์ง€์˜ ์˜์กด์„ฑ์„ ์„ค์น˜ ์ˆ˜ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์›ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•„๋Š” ๋ฐ”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ˜น์‹œ ์•„์‹œ๋Š” ๋ถ„ ๊ณ„์‹œ๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”.

DE

์ด๊ฒƒ์ด ์—„์ฒญ๋‚˜๊ฒŒ ์งง์ง€ ์•Š๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•  ๋•Œ, ์šฐ๋ฆฌ๊ฐ€ ์ด๊ฒƒ์„ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋„ฃ์„์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•ด ์•„๋งˆ๋„ ๋ฌผ์–ด๋ด์•ผ ํ•  ์งˆ๋ฌธ์€, ์‚ฌ๋žŒ๋“ค์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ, ๊ฐœ์ธ์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ฝ์„ ๋•Œ ๊ทธ๋“ค์˜ ์ •์‹  ๋ชจ๋ธ(mental model)์— ์–ผ๋งˆ๋‚˜ ๋„์›€์ด ๋˜๋Š”๊ฐ€์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ œ๊ฐ€ ๋น„๊ต ๋Œ€์ƒ์œผ๋กœ ๊ณ ๋ คํ•  ๋งŒํ•œ ๊ธฐ์ค€์„ ์€ promise withResolvers์™€ try-catch๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ด ๊ตฌ์„ฑ์€ ์‚ฌ๋žŒ๋“ค์ด ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ๋”ฐ๋ฅด๋„๋ก ๋•์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์˜ˆ์™ธ๋ฅผ ๋˜์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์žˆ๊ณ  ๊ทธ ๊ฐ’์„ ์–ป๊ณ  ์‹ถ์„ ๋•Œ ์˜ฌ๋ฐ”๋ฅธ ๊ด€์šฉ๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ํ•ด๋…ํ•˜๊ธฐ ๋” ๊นŒ๋‹ค๋กœ์šด ๋ฉ‹์ง„ ์กฐํ•ฉ๊ธฐ(combinator)๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜ ๋น„๊ต๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?

JHD

๊ทธ๊ฒƒ์ด ํ•™์Šต ๊ฐ€๋Šฅ์„ฑ๊ณผ ๊ฐ€๋…์„ฑ์— ๊ด€ํ•œ ๊ฒƒ์ด๋ผ๋Š” ์ ์—์„œ ์˜ฌ๋ฐ”๋ฅธ ์ƒ๊ฐ ๋ฐฉ์‹์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ จ๋œ ๋ฌธ์ž ์ˆ˜์—๋Š” ํฐ ์ฐจ์ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์— withResolvers๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ new Promise๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์—ฌ๋Ÿฌ ๋ฐฐ ๋” ๋‚˜์  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹จ์ง€ ์ด๊ฒƒ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋‚˜ ์ฆ‰์‹œ ์‹คํ–‰ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ์œ„ํ•ด์„œ ๋ง์ด์ฃ . ๊ทธ๋ž˜์„œ ์ €๋Š” ๊ทธ๊ฒƒ์ด ๋…ผ์˜์— ์•„๋ฌด๋Ÿฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐ€๋…์„ฑ์ด ์ค‘์š”ํ•˜๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜๋ฉฐ, ๋งŒ์•ฝ ์‚ฌ๋žŒ๋“ค์ด new Promise์™€ ์‹คํ–‰์ž ์ธ์ˆ˜๊ฐ€ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ๊ฐ์‹ธ๋Š” ๊ฒƒ์ด promise.try๋ณด๋‹ค ๋” ์ฝ๊ธฐ ์‰ฝ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋ฉด, ๊ทธ๊ฒƒ์€ ์–ธ์–ด์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋งค์šฐ ๊ฐ•๋ ฅํ•œ ๋ฐ˜๋ก ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ €๋Š” ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ทธ๋Ÿฐ ์ฃผ์žฅ์„ ํ•  ๊ฒƒ์ด๋ผ๊ณ ๋Š” ํšŒ์˜์ ์ž…๋‹ˆ๋‹ค.

NRO ๋‹˜์ด ๋‹ค์šด๋กœ๋“œ์˜ ์ ˆ๋ฐ˜์ด jest์—์„œ ์˜จ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค.
JHD

๋„ค, jest๊ฐ€ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ๋ผ๋Š” ์ ์€, ๊ทธ๊ฒƒ์ด tape์—๋„ ์ ์šฉ๋  ๊ฒƒ์ด๋ผ๋Š” ์ œ ์ง๊ด€๊ณผ ์–ด๋А ์ •๋„ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.

ํ๊ฐ€ ๋น„์—ˆ์Šต๋‹ˆ๋‹ค.
JHD

๊ทธ๋ ‡๋‹ค๋ฉด ์—ฌ์ „ํžˆ 2๋‹จ๊ณ„๋ฅผ ์š”์ฒญํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋„ค?

CDA

promise.try์— ๋Œ€ํ•œ 2๋‹จ๊ณ„ ์ง„์ž…์— ๋Œ€ํ•œ ๋ช…์‹œ์ ์ธ ์ง€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

SYG

์ œ๊ฐ€ ์ œ์•ˆํ–ˆ๋˜ ๊ฒƒ์€ ์ €์—๊ฒŒ (๊ตฌ์ฒด์ ์ธ ์˜ˆ๋ฅผ) ๋ณด์—ฌ์ฃผ์‹œ๋ฉด, 2๋‹จ๊ณ„๋‚˜ 2.7๋‹จ๊ณ„๋กœ ๋ฐ”๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋น„๋ก ์•„๋งˆ๋„ 2๋‹จ๊ณ„๋Š”โ€ฆ ๊ตฌ์ฒด์ ์ธ ์ฝ”๋“œ๋ฅผ ๋ณด๊ธฐ ์ „๊นŒ์ง€๋Š” ์ง€๊ธˆ ๋‹น์žฅ 2๋‹จ๊ณ„๋Š” ๋ถˆํŽธํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์–ด๋–ค ์ฝ”๋“œ๋“  ๊ดœ์ฐฎ์œผ๋‹ˆ, ์–ด๋””์— ์‚ฌ์šฉํ• ์ง€ ์ฝ์–ด๋ณผ ์ˆ˜ ์žˆ๋„๋ก์š”. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€, ์˜ˆ๋ฅผ ๋“ค์–ด, ์ง€๊ธˆ์ด๋‚˜ ๋‚ด์ผ์ด๋‚˜ ๊ทธ๋Ÿด ์ˆ˜ ์žˆ๊ณ , ๊ทธ ๋‹ค์Œ์—๋Š”โ€ฆ ์ธ์ž๋ฅผ ์•„๋ฌด๊ฒƒ๋„ ์ „๋‹ฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ์™ธ์— ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋” ์ƒ๊ฐํ•ด๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

JHD

๋„ค, ๊ทธ๋Ÿผ ๊ธฐ๋ก์„ ์œ„ํ•ด ๋‹ค์‹œ ๋ง์”€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. Promise.try๋Š” ์ง€๊ธˆ ๋‹น์žฅ ์ง„์ „๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Shu ๋‹˜๊ณผ, ์•„์‹œ๋‹ค์‹œํ”ผ, ๋” ๋„“์€ ์œ„์›ํšŒ์— ํ‰๊ฐ€๋ฅผ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋” ๊ตฌ์ฒด์ ์ธ ์˜ˆ๋ฅผ ์ œ๊ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Shu ๋‹˜์ด ์ด๊ฒƒ์„ ๊ตฌ์ฒด์ ์œผ๋กœ ํ‘œํ˜„ํ•œ ์œ ์ผํ•œ ๋ถ„์ด์ง€๋งŒ, ๋‹ค๋ฅธ ๋ˆ„๊ตฌ๋ผ๋„ ์ €์—๊ฒŒ ๊ดœ์ฐฎ๋‹ค๊ณ  ์•Œ๋ ค์ฃผ๋ฉด, ํšŒ์˜ ํ›„๋ฐ˜์— ์‹œ๊ฐ„์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๋Œ์•„์™€์„œ 2๋‹จ๊ณ„ ๋˜๋Š” ์ œ๊ฐ€ ์‚ฌ์ „์— ์•ˆ๊ฑด์— ์˜ฌ๋ฆฌ์ง€ ์•Š์•˜๋”๋ผ๋„ 2.7๋‹จ๊ณ„๋ฅผ ์š”์ฒญํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

Stage2 ๋กœ ์ง„์ž…ํ•˜๊ธฐ ์œ„ํ•ด์„œ Promise.try ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์‚ฌ์šฉ๋Ÿ‰์œผ๋กœ ์„ค๋“์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ, ์•„์ง ์—ฌ์ „ํžˆ Promise.try์— ๋Œ€ํ•œ ์˜๋ฌธ์€ ์—ฌ์ „ํžˆ ๋‚จ์•„์žˆ์—ˆ๋‹ค.
๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ฒ˜๋Š” jest์˜€๋‹ค๊ณ  ํ•œ๋‹ค. Jordan Harband๋„ tape ๋ผ๋Š” ํ…Œ์ŠคํŒ…๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค๋ค˜๋˜ ๊ฒƒ์„ ์ƒ๊ฐํ•˜๋ฉด ์ดํ•ด๊ฐ€ ๊ฐ€๋Š” ๋ถ€๋ถ„์ด๋‹ค. ํ…Œ์ŠคํŒ…ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž…์žฅ์—์„œ๋Š” ํ…Œ์ŠคํŠธ ์ฝœ๋ฐฑ์ด ๋™๊ธฐ์ธ์ง€, ๋น„๋™๊ธฐ์ธ์ง€ ๋ชจ๋ฅผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์œ„ํ•ด ์ €๋Ÿฐ ์‹์˜ ๋ฐฉ๋ฒ•๋“ค์ด ํ•„์š”ํ•˜์ง€ ์•Š์•˜์„๊นŒ ์ถ”์ธกํ•ด๋ณธ๋‹ค.

NCL

๋„ค. ์ œ๊ฐ€ ์˜ฌ๋ฆฐ ์ฃผ์ œ์ธ๋ฐ, ์•„๋งˆ ๋ช…ํ™•ํ•œ ์งˆ๋ฌธ์ด ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์™œ ํ•„์š”ํ•œ์ง€๋ฅผ ๋ณด์—ฌ์ค„ ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค๋งŒ, ์ด ๊ฒฝ์šฐ์— ์ •๋ง ํ•„์š”ํ•œ๊ฐ€์š”? ๊ทธ๋ƒฅ value = await synchronousfunction()์„ ํ•˜๋ฉด ์•ˆ ๋˜๋‚˜์š”? ๋˜‘๊ฐ™์ด ์ž‘๋™ํ•˜์ง€ ์•Š์„๊นŒ์š”?

KG

๋„ค. ์ €๋Š” ์—ฌ์ „ํžˆ ์ด๊ฒŒ ์™œ ํ•„์š”ํ•œ์ง€ ์ดํ•ด๊ฐ€ ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์™œ ํ•„์š”ํ•œ์ง€ ์ข€ ๋” ์„ค๋ช…ํ•ด์ฃผ์‹ค ์ˆ˜ ์žˆ๋‚˜์š”?

Stage 2.7 - 2024.04

Stage2์— ์ ‘์–ด๋“  ๋’ค๋กœ๋Š” ์ผ์‚ฌ์ฒœ๋ฆฌ๋กœ ์ง„ํ–‰๋˜์—ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ ์ด์ „๊ณผ ๋™์ผํ•œ ์˜๋ฌธ์€ ๊ณ„์† ์กด์žฌํ•˜์˜€๋‹ค. Promise์— ๊ธฐ์กด์— catch, finally๊ฐ€ ์žˆ์œผ๋‹ˆ try๋„ ์žˆ์œผ๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๋‹ค๋Š” ์˜๊ฒฌ๋„ ์žˆ์—ˆ๊ณ , ๋ถ„์œ„๊ธฐ๋Š” ์žˆ์œผ๋ฉด ์œ ์šฉํ•˜๊ธด ํ•  ๊ฒƒ ๊ฐ™์ง€๋งŒ, ๋ง‰์ƒ ๋ณธ์ธ์€ ์ž˜ ์‚ฌ์šฉํ•  ๊ฒƒ ๊ฐ™์ง€ ์•Š๋‹ค๋ผ๋Š” ์˜๊ฒฌ์ด ์ฃผ๋œ ์˜๊ฒฌ์ด์—ˆ๋‹ค.

async IIFE์™€ ๋™๋“ฑํ•˜์ง€ ์•Š๋ƒ๋Š” ์˜๊ฒฌ๋„ ์—ˆ์—ˆ๋‹ค. ์ด๋ถ€๋ถ„์€ ๊ฐ€๋” ์šฐ๋ฆฌ๊ฐ€์“ฐ๋Š” ํŒจํ„ด์—๋„ ์ ์šฉํ•  ์ˆ˜ ๊ฒƒ ๊ฐ™๋‹ค.
์žฆ์ง€๋Š” ์•Š์ง€๋งŒ ๊ฐ€๋” ์•„๋ž˜์™€๊ฐ™์ด effect ๋‚ด์—์„œ ๋น„๋™๊ธฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜์™€ ๊ฐ™์€ ํŒจํ„ด์ด ์“ฐ์ด๊ณค ํ•œ๋‹ค. (์˜ˆ์‹œ์ด๋‹ค)
๋‚˜ ์—ญ์‹œ๋„ IIFE ํŒจํ„ด์ด ์กฐ๊ธˆ๋” ์ต์ˆ™ํ•˜๊ธดํ•˜์ง€๋งŒ, ๊ทธ์น˜๋งŒ ์ธ์ง€์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ๊ณผ์ •์—์„  ํ›„์ž๋„ ์ถฉ๋ถ„ํžˆ ์ง๊ด€์ ์ด๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค. ์ด ๋…ผ์˜์—์„œ๋Š” await ๊ตฌ๋ฌธ์˜ ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง ๋น„์šฉ์ด ๋” ๋น„์‹ธ๋‹ค๋Š” ์ ์„ ๊ทผ๊ฑฐ๋กœ ๋“ค๊ณ  ์žˆ๋‹ค.

// โ‘  async IIFE ํŒจํ„ด
useEffect(() => {
  (async () => {
    try {
      const res = await fetch("https://api.example.com/data");
      const data = await res.json();
      console.log(data);
    } catch (err) {
      console.error(err);
    }
  })();
}, []);

// โ‘ก Promise.try ํŒจํ„ด
useEffect(() => {
  Promise.try(() => fetch("https://api.example.com/data"))
    .then((res) => res.json())
    .then(console.log)
    .catch(console.error);
}, []);

2024๋…„ 4์›” 8์ผ TC39 ๋ฏธํŒ… ๋‚ด์—ญ - Promise.try 2.7๋‹จ๊ณ„ ๋…ผ์˜ https://github.com/tc39/notes/blob/main/meetings/2024-04/april-08.md#promisetry-for-stage-27

JHD

๋„ค, Promise.try์— ๋Œ€ํ•ด ๋ง์”€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํšŒ์˜์—์„œ 2.7 ๋‹จ๊ณ„ ์ง„์ž…์„ ์š”์ฒญํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ๋ทฐ์–ด ์ค‘ ํ•œ ๋ถ„์€ ์•„์ง ํ™•์ธํ•ด์ฃผ์ง€ ์•Š์œผ์…จ์ง€๋งŒ, ๋‹ค๋ฅธ ๋ฆฌ๋ทฐ์–ด ํ•œ ๋ถ„๊ณผ ๋ชจ๋“  ํŽธ์ง‘์ž๋“ค์€ ํ™•์ธํ•ด์ฃผ์…จ์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๋ฏธ๊ฒฐ ์งˆ๋ฌธ์ด ํ•˜๋‚˜ ์žˆ์Šต๋‹ˆ๋‹ค: ํ•จ์ˆ˜์— ์ธ์ž๋ฅผ ์ „๋‹ฌํ•  ๊ฒƒ์ธ๊ฐ€ ํ•˜๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ, ์ƒ์„ฑ๋œ ๊ฒฐ๊ณผ๋ฌผ์„ ์ œ์™ธํ•˜๋ฉด ๋น„๊ต์  ์ž‘์€ ์ด ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด PR์€ ์ธ์ž ์ „๋‹ฌ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. main ๋ธŒ๋žœ์น˜์˜ ์ œ์•ˆ์€ ์ฝœ๋ฐฑ์„ ๋ฐ›์•„์„œ ์ธ์ž ์—†์ด ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋Œ€ํ‘œ ์œ„์›๋“ค์˜ ์š”์ฒญ์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ์ด ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋Š” Promise.try์— ์ œ๊ณต๋œ ์ถ”๊ฐ€ ์ธ์ž๋“ค์„ ์ฝœ๋ฐฑ์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์™ธ ๋‹ค๋ฅธ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ œ ํฌ๋ง์€ ์ด ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ํฌํ•จํ•œ ์ƒํƒœ๋กœ 2.7 ๋‹จ๊ณ„์— ๋Œ€ํ•œ ํ•ฉ์˜๋ฅผ ์–ป๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•ฉ์˜๊ฐ€ ์ด๋ฃจ์–ด์ง€๋ฉด, ์ด PR์„ ๋ณ‘ํ•ฉํ•˜๊ณ  ํ…Œ์ŠคํŠธ ์ž‘์—…์„ ์‹œ์ž‘ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

CDA๊ฐ€ Mark์—๊ฒŒ ๋ฐœ์–ธ๊ถŒ์„ ๋„˜๊น๋‹ˆ๋‹ค.
MM

์ธ์ž ์ถ”๊ฐ€๋Š” ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค๋ฉด, ์‚ฌ๋žŒ๋“ค์ด catch๋‚˜ then์—์„œ๋„ ๋˜‘๊ฐ™์ด ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š์„๊นŒ์š”? ์ด๊ฑด โ€“ ๋‹ค์‹œ ๋งํ•ด, ์ธ์ง€ ๋ถ€ํ•˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹๊นŒ์š”? then์€ ์ฐจ์น˜ํ•˜๊ณ , catch์—๋„ ์‹ค์ œ๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ผ๊นŒ์š”?

JHD

์ œ ์ƒ๊ฐ์— catch๋‚˜ then๊ณผ์˜ ์ฐจ์ด์ ์€, ๊ทธ๊ฒƒ๋“ค์€ ๊ธฐ์กด Promise์— ์ถ”๊ฐ€๋˜๋Š” ์ฝœ๋ฐฑ์ด๋ผ๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ then/catch/finally๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๋ฏธ์Šค ํŒŒ์ดํ”„๋ผ์ธ ์•ˆ์— ์žˆ๋Š” ์ƒํƒœ์ฃ .

MM
์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค.
JHD

๋ฐ˜๋ฉด Promise.try๋Š” ํ”„๋กœ๋ฏธ์Šค ํŒŒ์ดํ”„๋ผ์ธ์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ง„์ž…ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

MM
์ข‹์Šต๋‹ˆ๋‹ค.
JHD

๊ทธ๋ž˜์„œ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค โ€“ ํ‘œ๋ฉด์ ์œผ๋กœ๋Š” ๋น„์Šทํ•ด ๋ณด์ด์ฃ . ํ•˜์ง€๋งŒ ์ œ ์ƒ๊ฐ์—๋Š” then, catch, finally API์™€ ๊ตฌ๋ฌธ(async/await) ๊ฐ„์˜ ์œ ์‚ฌ์„ฑ์ด Promise.try ๋Œ€ then/catch/finally๋ณด๋‹ค ๋” ์ค‘์š”ํ•˜๋‹ค๊ณ  ๋ด…๋‹ˆ๋‹ค. ์„ค๋ น ๊ฐœ๋…์ ์œผ๋กœ ๋‹ค๋ฅด์ง€ ์•Š๋‹ค๊ณ  ํ•ด๋„ ๋ง์ด์ฃ  (์ €๋Š” ๋‹ค๋ฅด๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค).

MM

๋„ค. ๋ฐ›์•„๋“ค์ด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ข‹์€ ๊ทผ๊ฑฐ์ธ ๊ฒƒ ๊ฐ™๋„ค์š”.

JHD

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

MM

๋‹ค๋ฅธ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Promise.try๋Š” ์ฝ”๋“œ๋ฅผ async IIFE(์ฆ‰์‹œ ์‹คํ–‰ ๋น„๋™๊ธฐ ํ•จ์ˆ˜)๋กœ ๊ฐ์‹ธ๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ๊ฐ€์š”?

JHD

๋„ค. (ํƒ€์ดํ•‘ํ•˜๋ฉฐ ๋ณด์—ฌ์คŒ)

MM

async IIFE์™€์˜ ๋Œ€์นญ์„ฑ์„ ๊ณ ๋ คํ•  ๋•Œ, ์™œ ์‚ฌ๋žŒ๋“ค์ด async IIFE๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ถŒ์žฅํ•˜๋Š” ๋Œ€์‹  try๋ฅผ ์ถ”๊ฐ€ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š”์ง€ ์„ค๋ช…ํ•ด์ฃผ์‹ญ์‹œ์˜ค.

JHD

๋ฌผ๋ก ์ž…๋‹ˆ๋‹ค. ์ด ๋‚ด์šฉ์€ 1๋‹จ๊ณ„ ๋…ผ์˜์™€ ์•ฝ ๋‘ ์ฐจ๋ก€์˜ ํ† ๋ก ์—์„œ ๋‹ค๋ฃจ์–ด์กŒ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ณธ์งˆ์ ์œผ๋กœ, ์ฒซ ๋ฒˆ์งธ ์ด์œ ๋Š” ์˜ค๋ž˜๋œ ํ™˜๊ฒฝ์„ ์ง€์›ํ•ด์•ผ ํ•  ๊ฒฝ์šฐ, ๊ตฌ๋ฌธ(syntax)์€ ํŠธ๋žœ์ŠคํŒŒ์ผ ๋น„์šฉ์ด ๋” ๋น„์‹ธ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์ ์€, ๊ทธ ์งˆ๋ฌธ ๋•Œ๋ฌธ์— ์ด ์ œ์•ˆ์ด 1๋‹จ๊ณ„์—์„œ ๊ฑฐ์˜ 9๋…„ ๋™์•ˆ ๋ฉˆ์ถฐ ์žˆ์—ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ(ํด๋ฆฌํ•„ ๋“ฑ)์€ 440์–ต ๋‹ค์šด๋กœ๋“œ๋ฅผ ๊ธฐ๋กํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ํ˜•ํƒœ๊ฐ€ ๋‹จ์ˆœํžˆ async IIFE๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์„ ํ˜ธ๋˜๊ฑฐ๋‚˜ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒฝํ—˜์  ์ฆ๊ฑฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ ์ฃผ๊ด€์ ์ธ ๋ฏธ์  ๊ฒฌํ•ด๋กœ๋Š”, ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ง€์ €๋ถ„ํ•˜๋ฉฐ, ๋ชจ๋“ˆ์ด ์žˆ๋Š” ํ™˜๊ฒฝ์—์„œ๋Š” ๊ตฌ์‹ ๋ฐฉ์‹์ด ๋˜์—ˆ๊ณ  ์ €๋Š” ๊ทธ๋ ‡๊ฒŒ ์œ ์ง€๋˜๊ธฐ๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ฃผ๊ด€์ ์ธ ์˜๊ฒฌ์ด๋ฉฐ ์•„๋ฌด๋„ ๋™์˜ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ•ด๋‹น ํŒจํ‚ค์ง€์™€ ๊ทธ ๊ธฐ๋Šฅ์ด ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์„ ์ œ๊ฐ€ (ํ‘œ์ค€ํ™”๋ฅผ ํ†ตํ•ด) ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋งŒ๋“ค๋ ค๊ณ  ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

MM

๊ฒฝํ—˜์  ์ฆ๊ฑฐ๊ฐ€ ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

JHD

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

KG

์ด๊ฒƒ์€ MM์ด ์ด์ „์— ์ œ๊ธฐํ•œ ๋‚ด์šฉ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด then์ด๋‚˜ catch์™€ ๋‹ค๋ฅด๋‹ค๋Š” ์ ์„ ๋ช…ํ™•ํžˆ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ ์ฝœ๋ฐฑ์„ ๋ฐ›๋Š” ๋ฉ”์„œ๋“œ์ด์ง€๋งŒ, ์ด๊ฑด ๋” ์ผ๋ฐ˜์ ์ธ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. ํŠน์ • ํ˜•ํƒœ์˜ ํ•จ์ˆ˜๋ฅผ ๋ฐ›๋Š” ๊ฒƒ๋“ค, ์˜ˆ๋ฅผ ๋“ค์–ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์ธ Function.prototype.call์ด๋‚˜ Function.prototype.apply ๊ฐ™์€ ๊ฒƒ๋“ค์€ ์ธ์ž๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ํƒ€๋‹นํ•ฉ๋‹ˆ๋‹ค. catch์ฒ˜๋Ÿผ ํŠน์ • ํ˜•ํƒœ๋ฅผ ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒƒ๋“ค์€ (์ธ์ž ์ „๋‹ฌ์ด) ๋œ ํƒ€๋‹นํ•ฉ๋‹ˆ๋‹ค.

SYG

์˜ค๋ž˜๋œ ํ™˜๊ฒฝ ์ฃผ์žฅ์— ๋Œ€ํ•ด ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ ๋ถ€๋ถ„์„ ๋ช…ํ™•ํžˆ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. JHD๊ฐ€ ๊ตฌ๋ฌธ ํŠธ๋žœ์ŠคํŒŒ์ผ์ด ๋น„์Œ€ ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ƒํ™ฉ์€ async/await๊ฐ€ ์—†๋Š” ์˜ค๋ž˜๋œ ํ™˜๊ฒฝ์ด ์žˆ์–ด์„œ async/await๋ฅผ ํŠธ๋žœ์ŠคํŒŒ์ผํ•ด์•ผ ํ•˜๋Š”๋ฐ, ๊ทธ ํ™˜๊ฒฝ์— ์ƒˆ๋กœ ํ‘œ์ค€ํ™”๋œ Promise.try ๋ฉ”์„œ๋“œ๋Š” ์žˆ๋‹ค๋Š” ๊ฑด๊ฐ€์š”? ์ดํ•ด๊ฐ€ ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

JHD

Promise.try๋Š” ํด๋ฆฌํ•„(polyfill)์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. Async๋Š” ๊ทธ๋ ‡์ง€ ์•Š์ฃ . ์ฆ‰, ํ™˜๊ฒฝ์— ์„ค์น˜๋  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜๋กœ ์กด์žฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Promise.try๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ์ง€์›ํ•˜๋Š” ๊ฒƒ์˜ ์•„์ฃผ ์ž‘์€ ๋ถ€๋ถ„์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋งŒ์•ฝ ๊ทธ๊ฒƒ๋งŒ์ด ๋ฌธ์ œ๋ผ๋ฉด, ๋ˆ„๊ตฐ๊ฐ€ ์ด ๋ชฉ์ ์œผ๋กœ ์ฆ‰์‹œ ์‹คํ–‰ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ํ•ด๋‹น ํ•จ์ˆ˜๋กœ ๋Œ€์ฒดํ•˜๋Š” ์ •์  ๋ถ„์„ ๋ณ€ํ™˜์„ ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ๊ฒ ์ฃ . ์‹ค์ œ๋กœ๋Š” ๊ทธ๋Ÿฐ ๊ฒƒ์€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

SYG

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ ์šฐ๋ คํ•˜๋Š” ์ ์€ โ€“ ์ข‹์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์†Œ์Šค ์ฝ”๋“œ(ํŠธ๋žœ์ŠคํŒŒ์ผ ์ „ ์†Œ์Šค)์—์„œ ์ตœ์‹  JS๋ฅผ ์ž‘์„ฑํ•˜์ง€๋งŒ, ๋„ˆ๋ฌด ์˜ค๋ž˜๋˜์–ด ๋„ค์ดํ‹ฐ๋ธŒ async/await ์ง€์›์ด ์—†๋Š” ์˜ค๋ž˜๋œ ํ™˜๊ฒฝ์„ ํƒ€๊ฒŸ์œผ๋กœ ํ•˜๋Š” ์‚ฌ์šฉ์ž๋“ค์ด ์žˆ๋‹ค๋ฉด, ์šฐ๋ฆฌ๊ฐ€ Promise.try๋ฅผ ํ‘œ์ค€ํ™”ํ•˜๋ฉด await ํŠธ๋žœ์ŠคํŒŒ์ผ๋ณด๋‹ค (์ด๊ฑธ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด) ๋” ๋‚˜์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑด๊ฐ€์š”? ์ด๊ฒƒ์ด ๋งž๊ฒŒ ์ดํ•ดํ•œ ๊ฒƒ์ž…๋‹ˆ๊นŒ?

JHD

๊ทธ๊ฒŒ ์ œ๊ฐ€ ์˜๋„ํ•œ ๋ฐ”์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๊ฒŒ ์ด ์ œ์•ˆ์˜ ์ฃผ๋œ ๋™๊ธฐ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜ ์ž‘์—…์„ ํ•˜๋Š” ์šฐ๋ฆฌ์—๊ฒŒ๋Š” ๋ถ€์ˆ˜์ ์ธ ์ด์ ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์ฃผ๋œ ๋™๊ธฐ๋Š” ์–ด๋–ค ํ˜•ํƒœ์˜ ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๋ณด๋‹ค ์ œ๊ฐ€ ํ•˜๋ ค๋Š” ๊ฒƒ์ด ๋” ๋ช…ํ™•ํ•˜๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

CDA๊ฐ€ KG์—๊ฒŒ ๋ฐœ์–ธ๊ถŒ์„ ๋„˜๊น๋‹ˆ๋‹ค.
KG

๋„ค. ์ด ์ œ์•ˆ์˜ ์ฃผ๋œ ๋™๊ธฐ์—๋Š” ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ํด๋ฆฌํ•„ ๊ฐ€๋Šฅ์„ฑ ๋ถ€๋ถ„์€ ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ํŒจํ‚ค์ง€๊ฐ€ ์žˆ์„ ์ˆ˜๋„ ์žˆ์ž–์•„์š”. ๋งŒ์•ฝ ๋‹น์‹ ์ด โ€“

JHD

๋งž์Šต๋‹ˆ๋‹ค. ๋‹น์‹  ๋ง์ด ์˜ณ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๊ทธ๊ฒƒ์„ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ด ๋” ๋งŽ์€ ํ˜ผ๋ž€์„ ์•ผ๊ธฐํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

KG
์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค.
JHD

๋„ค. ํด๋ฆฌํ•„ ๊ฐ€๋Šฅ์„ฑ์€ ์œ„์›ํšŒ๋กœ์„œ ์šฐ๋ฆฌ๊ฐ€ ์„ค๊ณ„ ๊ฒฐ์ •์„ ๋™๊ธฐ ๋ถ€์—ฌํ•˜๊ฑฐ๋‚˜ ์–ด๋–ค ๊ฒƒ์˜ ํฌํ•จ์„ ์ •๋‹นํ™”ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ•ฉ์˜ํ•œ ์ ์ด ์—†๋Š” ๋™๊ธฐ์ด๋ฉฐ, ์—ฌ๊ธฐ์„œ ์ œ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ์ฃผ์žฅํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

KG
์ œ๊ฐ€ ํ™•์ธํ•˜๊ณ  ์‹ถ์—ˆ๋˜ ๊ฒƒ์€ ๊ทธ๋ฟ์ž…๋‹ˆ๋‹ค.
DRR

์ œ ๋ง์€, ์—ฌ๊ธฐ์„œ ์ฃผ์žฅ ์ค‘ ํ•˜๋‚˜๋Š” ๋ช…ํ™•์„ฑ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  โ€“ ์ €๋Š” ์ด ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•ด ์™„์ „ํžˆ ํ™•์‹ ์ด ์„œ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋งŒ์•ฝ ์šฐ๋ฆฌ๊ฐ€ ์ด๊ฒƒ์„ ์ถ”์ง„ํ•˜๊ณ  ์ „์ฒด ๋ชฉํ‘œ๊ฐ€ ๋ช…ํ™•์„ฑ์ด๋ผ๋ฉด, try๋ผ๋Š” ์ด๋ฆ„์€ ์ •๋ง๋กœ ํ”„๋กœ๋ฏธ์Šค์™€ ๊ด€๋ จํ•˜์—ฌ ์–ด๋–ค ์‹์œผ๋กœ๋“  ์˜ˆ์™ธ(exception)์™€ ๊ด€๋ จ์ด ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

JHD

๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.

DRR
๋„ค. ๊ทธ๋ ‡๊ธด ํ•œ๋ฐโ€ฆ
JHD

์ด๊ฒƒ์ด ๋” ํŽธ๋ฆฌํ•˜๊ฒŒ ๋งŒ๋“ค๋ ค๊ณ  ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์‚ฌ๋ก€๋Š” ํ•จ์ˆ˜๊ฐ€ ๋™๊ธฐ์  ์˜ˆ์™ธ๋ฅผ ๋˜์งˆ ๋•Œ์ž…๋‹ˆ๋‹ค.

DRR

๊ทธ๋ž˜์„œ ๊ทธ๊ฑธ ์ฒ˜๋ฆฌํ•˜๋Š”๊ตฐ์š”. ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ Promise.resolve ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์—†๊ตฐ์š”.

JHD

์˜ˆ์™ธ๋ฅผ ๋˜์ง€๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋Ÿด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Promise.catch ๋“ฑ์œผ๋กœ ๊ฐ์‹ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

DRR

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ดํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‚ฌ์‹ค์ƒ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ๊ทธ๊ฒƒ์„ try-catch๋กœ ๊ฐ์‹ผ ๋‹ค์Œ (์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ) rejectํ•˜๋Š” ๊ฒƒ์ด๊ตฐ์š”.

DRR

๊ทธ๋ ‡๊ตฐ์š”. ๋„ค. ์ด๋ฆ„์ด adapt ๊ฐ™์€ ๊ฒƒ์ด์—ˆ์œผ๋ฉด ์ข‹์•˜์„ ํ…๋ฐ์š”.

JHD

์ด๋ฆ„์— ์ง‘์ฐฉํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋“ค์„ ๋ณด๋ฉด ํ•ญ์ƒ try๋ผ๊ณ  ๋ถˆ๋ ธ์Šต๋‹ˆ๋‹ค. ์•„๋‹ˆ, ๋ชฉ๋ก์— attempt๋„ ์žˆ๊ณ , fcall๋„ ์žˆ๊ธด ํ•ฉ๋‹ˆ๋‹ค (ํ•˜์ง€๋งŒ fcall์€ ์•„๋ฌด๋„ ์ง€์ง€ํ•  ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค). attempt๋Š” ํฅ๋ฏธ๋กœ์šด ๋Œ€์•ˆ์ด์ง€๋งŒ ๋ชฉ๋ก์— ํ•œ ๋ฒˆ๋งŒ ๋“ฑ์žฅํ–ˆ๊ณ , ๊ทธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์กฐ์ฐจ ์—ฌ์ „ํžˆ try๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

DRR
๋„ค. ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ข‹์Šต๋‹ˆ๋‹ค.
JHD

๊ทธ๋ ‡๋‹ค๋ฉด, ์ธ์ž๋ฅผ ์ „๋‹ฌํ•˜๋Š” ํ•ด๋‹น ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ๋ณ‘ํ•ฉํ•˜๋Š” ์กฐ๊ฑด์œผ๋กœ 2.7 ๋‹จ๊ณ„์— ๋Œ€ํ•œ ํ•ฉ์˜๋ฅผ ์š”์ฒญํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

CDA๊ฐ€ MM์œผ๋กœ๋ถ€ํ„ฐ ์ง€์ง€๋ฅผ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.
CDA

Promise.try์˜ 2.7 ๋‹จ๊ณ„ ์ง„์ž…์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ง€ํ•˜๋Š” ๋‹ค๋ฅธ ๋ชฉ์†Œ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? DE?

DE

ํ† ๋ก  ์ค‘์— ๋ช‡๋ช‡ ๋ถ„๋“ค์ด ๋™๊ธฐ์— ๋Œ€ํ•ด ๋‹ค์†Œ ๋ง‰์—ฐํ•˜๊ฒŒ ์˜๋ฌธ์„ ์ œ๊ธฐํ•˜๋Š” ๊ฒƒ์„ ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ €๋„ ์ด ์ œ์•ˆ์— ๋Œ€ํ•ด ๋น„์Šทํ•˜๊ฒŒ ๋А๋‚๋‹ˆ๋‹ค. ๋‚˜๋น  ๋ณด์ด์ง€๋Š” ์•Š์ง€๋งŒ, ์ œ๊ฐ€ ๊ฐœ์ธ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ๊ฒƒ ๊ฐ™์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์œ„์›ํšŒ ๋‚ด์—์„œ ์ด ์ œ์•ˆ์˜ ๋™๊ธฐ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ž˜ ๋ฐ›์•„๋“ค์—ฌ์ง€๊ณ  ์žˆ๋Š”์ง€ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์˜จ๋„ ์ฒดํฌ(์˜๊ฒฌ ์กฐ์‚ฌ) ๊ฐ™์€ ๊ฒƒ์„ ํ•ด์•ผ ํ• ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต ์˜จ๋„ ์ฒดํฌ๋ฅผ ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์ง€๋งŒ, ํšŒ์˜์ ์ธ ์‹œ๊ฐ๊ณผ ๋ช…์‹œ์ ์ธ ์ง€์ง€ ๋น„์œจ์— ๋Œ€ํ•ด ์•ฝ๊ฐ„ ์šฐ๋ ค๋ฉ๋‹ˆ๋‹ค.

JHD

์ œ ๋ง์€, ๊ทธ๊ฒƒ์ด ์ ์ ˆํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋ฉด ๋‹น์—ฐํžˆ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๊ฑด 2๋‹จ๊ณ„๋กœ ๊ฐˆ ๋•Œ ๋ฌผ์–ด๋ด์•ผ ํ•  ์งˆ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. 2๋‹จ๊ณ„ ์Šน์ธ์€ ์œ„์›ํšŒ๊ฐ€ ๋™๊ธฐ์— ๋™์˜ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

DE

๋ฌผ๋ก ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ 2.7 ๋‹จ๊ณ„ ์ œ์•ˆ ์‹œ์—๋Š” ์ด๋Ÿฐ ์ผ์ด ๊ฝค ํ”ํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ฐ€ 2๋‹จ๊ณ„๊นŒ์ง€ ์ง„ํ–‰์‹œํ‚จ ์ œ์•ˆ๋“ค์ด 2๋‹จ๊ณ„ ์ดํ›„์— ๋” ์ด์ƒ ๋™๊ธฐ ๋ถ€์—ฌ๊ฐ€ ํ•„์š” ์—†์—ˆ๋‹ค๋ฉด ํ›จ์”ฌ ์ผ์ด ์ ์—ˆ์„ ๊ฒ๋‹ˆ๋‹ค. ๋„ค. ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์œ„์›ํšŒ์—์„œ ๋ฐ˜๋ณต์ ์ธ ํ•ฉ์˜๋ฅผ ์š”๊ตฌํ•˜๋Š” ๋ณด์ˆ˜์ ์ธ ๊ธฐ๋ณธ ์›์น™์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ฃ .

JHD

๋„ค. ์ œ ๋ง์€, ์œ„์›ํšŒ ์‹œ๊ฐ„์„ ์ž˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋ฉด ๋ถ„๋ช…ํžˆ ๊ทธ ๊ณผ์ •์„ ๊ฑฐ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ โ€“ ๋ถ€์ •์ ์ธ ์ ์ด ์—†๊ณ  ๊ธ์ •์ ์ธ ์ ์ด ์žˆ์œผ๋ฉฐ, ์‚ฌ์šฉ์ž ์˜์—ญ(user-land)์—์„œ ๊ทธ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ์ƒ๋‹นํ•œ ์ฆ๊ฑฐ๊ฐ€ ์žˆ๋‹ค๋ฉด, ์ œ๊ฒŒ๋Š” ๊ฝค ๋ช…ํ™•ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

DE

๊ทธ๋ž˜์„œ ์ €๋Š” โ€“ ์˜จ๋„ ์ฒดํฌ๋ฅผ ํ—ˆ์šฉํ• ์ง€ ์—ฌ๋ถ€๋Š” ๋‹น์‹ ์—๊ฒŒ ๋งก๊ธฐ๊ฒ ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ถ€์ ์ ˆํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ํ•˜์ง€ ๋ง™์‹œ๋‹ค.

CDA๊ฐ€ ๋Œ€๊ธฐ์—ด์— ์žˆ๋Š” MM์—๊ฒŒ ๋ฐœ์–ธ๊ถŒ์„ ๋„˜๊น๋‹ˆ๋‹ค.
MM

๋„ค. ์˜จ๋„ ์ฒดํฌ๋ฅผ ํ•˜๋Š” ๊ฒƒ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์˜จ๋„ ์ฒดํฌ๋ฅผ ํ•˜๊ธฐ ์ „์—, ์ด ์ œ์•ˆ์— ์ฐฌ์„ฑํ•˜๋Š” ์ธ์ง€ ๋ถ€ํ•˜ ๊ด€๋ จ ์ฃผ์žฅ์„ ํ•˜๋‚˜ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๋ฏธ์Šค์—๋Š” catch์™€ finally๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ๊ฒƒ์„ ๋ณด๋Š” ์‚ฌ๋žŒ๋“ค์€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ Promise.try๋ฅผ ์ฐพ์„ ๊ฒƒ์ด๊ณ , ์ €๋Š” ๊ทธ๊ฒƒ์ด ์—†๋Š” ๊ฒƒ๋ณด๋‹ค catch ๋ฐ finally์™€ ์ž˜ ์—ฐ๊ณ„๋˜์–ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด ๋œ ๋†€๋ž๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

JHD

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ œ์•ˆ์ž๋กœ์„œ, ์ œ์•ˆ๋œ ์˜จ๋„ ์ฒดํฌ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ์ด๊ธฐ์ ์ธ ํ–‰๋™์ด ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ €๋Š” ์ด๊ธฐ์ ์œผ๋กœ ํ–‰๋™ํ•˜๋ ค๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์‚ฌ๋žŒ๋“ค์ด ์ด๊ฒƒ์ด ์œ„์›ํšŒ ์‹œ๊ฐ„์„ ์ž˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋ฉด, ๋‹น์—ฐํžˆ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๊ทธ๊ฒƒ์ด ์œ„์›ํšŒ ์‹œ๊ฐ„์„ ์ž˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ผ๋Š” ์–ด๋–ค ์ง•ํ›„๋„ ๋ณด์ง€ ๋ชปํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ์ ์— ๋Œ€ํ•ด์„œ๋Š” ํšŒ์˜์žฅ ์ „์ฒด์˜ ์˜๊ฒฌ์— ๋”ฐ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

MM
์˜จ๋„ ์ฒดํฌ๋ฅผ ํ•ฉ์‹œ๋‹ค.
JHD

์ข‹์Šต๋‹ˆ๋‹ค. ํ•ฉ์‹œ๋‹ค.

์˜จ๋„ ์ฒดํฌ๋ฅผ ์œ„ํ•œ ๋…ผ์˜๊ฐ€ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.
CDA

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ •ํ™•ํžˆ ๋ฌด์—‡์ธ์ง€, ๊ฐ ์„ ํƒ์ง€๊ฐ€ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์ •์˜ํ•ฉ์‹œ๋‹ค.

DE

์•„๋งˆ๋„ ์˜จ๋„ ์ฒดํฌ ์งˆ๋ฌธ์€ โ€˜์ด ์ œ์•ˆ์ด ๋‹น์‹ ์—๊ฒŒ ์œ ์šฉํ•ด ๋ณด์ž…๋‹ˆ๊นŒ?โ€˜๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ฒ ๋„ค์š”. โ€˜๋งค์šฐ ๊ธ์ •์ โ€™๋ถ€ํ„ฐ โ€˜ํ™•์‹  ์—†์Œ/ํ˜ผ๋ž€์Šค๋Ÿฌ์›€โ€™๊นŒ์ง€์˜ ์ŠคํŽ™ํŠธ๋Ÿผ์ด ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ์งˆ๋ฌธ์— ๋”ฑ ๋งž๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์„ธ์š”, JHD? ์งˆ๋ฌธ์€ ์ด๋Ÿฐ ์‹์œผ๋กœ์š”.

JHD

๋„ค. ๋งŒ์•ฝ ๋” ๋ถ€์ •์ ์ธ ๊ฐ์ •์„ ๊ฐ€์ง„ ๋ถ„์ด ์žˆ๋‹ค๋ฉด, ๋Œ€๊ธฐ์—ด์— ์ฐธ์—ฌํ•ด์„œ ๊ฐ•์กฐํ•ด์ฃผ์„ธ์š”. ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด, ์ด๋ชจ์ง€์˜ ๊ธฐ๋ณธ ๋ผ๋ฒจ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

DE
โ€์ด ์ œ์•ˆ์ด ๋‹น์‹ ์—๊ฒŒ ์œ ์šฉํ•ด ๋ณด์ž…๋‹ˆ๊นŒ?โ€
KG

๋ช…ํ™•ํžˆ ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? โ€˜์ด ์ œ์•ˆ์ด ๋‹น์‹ ์—๊ฒŒ ์œ ์šฉํ•ด ๋ณด์ž…๋‹ˆ๊นŒ?โ€˜์ธ๊ฐ€์š”, ์•„๋‹ˆ๋ฉด โ€˜๋‹น์‹ ์ด ๋ณด๊ธฐ์— ์ด ์ œ์•ˆ์ด ์œ ์šฉํ•ด ๋ณด์ž…๋‹ˆ๊นŒ?โ€˜์ธ๊ฐ€์š”? ์™œ๋ƒํ•˜๋ฉด ์ œ๊ฐ€ ๊ฐœ์ธ์ ์œผ๋กœ ์ ˆ๋Œ€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ๋“ค์ด ๋งŽ์ง€๋งŒ, ์œ ์šฉํ•ด ๋ณด์ด๋Š” ๊ฒƒ๋“ค์€ ํ™•์‹คํžˆ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

DE

์ข‹์Šต๋‹ˆ๋‹ค. โ€˜๋‹น์‹ ์ด ๋ณด๊ธฐ์— ์œ ์šฉํ•˜๋‹คโ€™๊ฐ€ ๋” ํฌ๊ด„์ ์ธ ์˜๋ฏธ๊ฒ ๋„ค์š”. ๋„ค.

JHD

๋‹ค์‹œ ๋งํ•ด, ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ์œ ์šฉํ•œ๊ฐ€ ํ•˜๋Š” ๊ฑฐ์ฃ .

์˜จ๋„ ์ฒดํฌ ํˆฌํ‘œ๊ฐ€ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.
NRO

์ œ ์ž…์žฅ์€ โ€˜๋‚˜์˜์ง€ ์•Š๋‹คโ€™์ด์ง€๋งŒ, ์ผ๋ฐ˜์ ์œผ๋กœ ์œ ์šฉํ•˜๋‹ค๋Š” ์ ์—๋Š” ํ™•์‹ ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ €์™€ ๊ฐ™์€ ์ž…์žฅ์„ ๊ฐ€์ง„ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ โ€˜๋ฌด๊ด€์‹ฌ(indifferent)โ€˜์„ ์„ ํƒํ–ˆ๋Š”๋ฐ, ์ด๊ฒƒ์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”์™€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ๊ฐ€์š”?

JHD

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹น์‹ ์€ ์ฃผ์žฅ์— ์„ค๋“๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฑฐ์ฃ .

NRO

์ €๋Š” ์ธ๊ธฐ๋„ ๋•Œ๋ฌธ์— ์„ค๋“๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํŒจํ‚ค์ง€์˜ ์ด์ ์„ ์ž˜ ๋ชจ๋ฅด๊ฒ ๊ณ , ๋‹ค๋ฅธ ๋ถ„๋“ค์ด ์–ธ๊ธ‰ํ•œ ์ž…์žฅ๊ณผ ๋น„์Šทํ•ด ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๊ฑด ๋‚˜์˜์ง€ ์•Š์ง€๋งŒ ์œ ์šฉํ•˜๋‹ค๊ณ  ๋ณด์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฑฐ์ฃ . DE๊ฐ€ ๊ฐ™์€ ์ž…์žฅ์„ ํ‘œ๋ช…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ €๋Š” โ€˜๋ฌด๊ด€์‹ฌ(indifferent)โ€˜์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

JHD

๋„ค. ์ œ ๋ง์€, ์ถฉ๋ถ„ํ•œ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š”์ง€์— ๋” ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ โ€˜๋‚˜์—๊ฒŒ๋Š” ์œ ์šฉํ•˜๋‹คโ€™๊ณ  ๋งํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์žˆ๊ณ  ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์„ ๋ฌดํšจํ™”ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ๋Š” ๋ถ„๋ช…ํžˆ ์œ ์šฉํ•˜์ฃ . ํ•˜์ง€๋งŒ ๋„ค. ์ œ ๋ง์€, ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์˜จ๋„ ์ฒดํฌ ๊ฒฐ๊ณผ: ๊ธ์ • 6ํ‘œ, ๋ถ€์ • 10ํ‘œ
DE

โ€˜๋ฌด๊ด€์‹ฌ(Indifferent)โ€˜์€ ์™„์ „ํžˆ ๋ถ€์ •์ ์ธ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š” ์ด์— ๋Œ€ํ•œ ์ฆ๊ฑฐ๋ฅผ ์กฐ๊ธˆ ๋” ๊ฐ€์ง€๊ณ  ๋Œ์•„์˜ค๋Š” ๊ฒƒ์ด ์ตœ์„ ์ผ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ํˆฌํ‘œ ์ž์ฒด๊ฐ€ ์–ด๋–ค ๊ฒฐ๋ก ์„ ๋‚ด๋ฆฌ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ œ๊ฐ€ ์ œ์•ˆ์ž์—๊ฒŒ ๊ถŒ์žฅํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์€ ๊ทธ๊ฒƒ์ž…๋‹ˆ๋‹ค.

JHD

๋„ค. ์ œ ๋ง์€, ์ œ ์ฃผ์žฅ์€ ์™„์„ฑ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ์ถ”๊ฐ€์ ์ธ ์ฆ๊ฑฐ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์„์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ œ ๋ง์€, 2๋‹จ๊ณ„์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ ๊ทธ ๋ฐœํ‘œ๋ฅผ ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ๊ฒƒ์ด ์–ด๋–ค ๊ฐ€์น˜๋ฅผ ๋”ํ• ์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ˆ„๊ตฐ๊ฐ€ ์ œ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋„๋ก 2.7 ๋‹จ๊ณ„์— ๋Œ€ํ•œ ํ•ฉ์˜๋ฅผ ๋ณด๋ฅ˜ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ €๋Š” ์ •๋ง๋กœ โ€“ ๋ฌด์—‡์„ ๋‹ค์‹œ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ํ–‰๋™ ์š”๊ตฌ๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ด๋ฏธ ๋‹ค ์ œ์‹œ๋œ ๊ฒƒ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

CDA๊ฐ€ ์‹œ๊ฐ„์ด ๊ฑฐ์˜ ๋‹ค ๋˜์—ˆ์Œ์„ ์•Œ๋ฆฌ๊ณ  MM์—๊ฒŒ ๋ฐœ์–ธ๊ถŒ์„ ๋„˜๊น๋‹ˆ๋‹ค.

MM

๋„ค. ์ €๋Š” ๊ธฐ๊ถŒ(abstain)์ด ์•„๋‹ˆ๋ผ ๋ฌด๊ด€์‹ฌ(indifferent)์ž…๋‹ˆ๋‹ค. ๋ถ€์ •์ ์ธ ์˜๊ฒฌ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ถ€์ •์ ์ธ ์˜๊ฒฌ์€ ๋”ฐ๋กœ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ง€๊ธˆ ๋ฐ”๋กœ ํ•ฉ์˜๋ฅผ ์š”์ฒญํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

JHD

๊ทธ๋Ÿผ ๋„ค, 2.7 ๋‹จ๊ณ„์— ๋Œ€ํ•œ ํ•ฉ์˜๋ฅผ ๋‹ค์‹œ ์š”์ฒญํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ์ฐธ์„์ž๋“ค์ด ์ง€์ง€ ์˜์‚ฌ๋ฅผ ํ‘œ๋ช…ํ•ฉ๋‹ˆ๋‹ค.
MM
์ง€์ง€ํ•ฉ๋‹ˆ๋‹ค.
WH
์ง€์ง€ํ•ฉ๋‹ˆ๋‹ค.
BSH
์ง€์ง€ํ•ฉ๋‹ˆ๋‹ค.
CDA

TKP๋กœ๋ถ€ํ„ฐ +1์ž…๋‹ˆ๋‹ค. ์ข‹์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€ํ•˜๋Š” ๋ถ„ ๊ณ„์‹ ๊ฐ€์š”? ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ˜๋Œ€ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๊ธฐ๋ก์„ ์œ„ํ•ด ๋‹ค๋ฅธ ์˜๊ฒฌ์„ ๋ฐํžˆ๊ณ  ์‹ถ์€ ๋ถ„ ๊ณ„์‹ ๊ฐ€์š”?

DE

์ €๋Š” Mark๊ฐ€ โ€˜๋ฌด๊ด€์‹ฌ(indifferent)โ€˜์„ ๊ธฐ๊ถŒ(abstain)์œผ๋กœ ํ•ด์„ํ•œ ๊ฒƒ์— ๋Œ€ํ•ด ์•ฝ๊ฐ„ ๋ฐ˜๋Œ€ ์˜๊ฒฌ์„ ํ‘œํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ธฐ๊ถŒํ•˜๊ณ  ์‹ถ์œผ๋ฉด ๊ธฐ๊ถŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” Nicolo๊ฐ€ ๋งํ•œ ์˜๋ฏธ๋กœ โ€˜๋ฌด๊ด€์‹ฌโ€™์— ํˆฌํ‘œํ–ˆ์ง€๋งŒ, ํ•ฉ์˜์— ๋ฐ˜๋Œ€ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

MM

(ํˆฌํ‘œ ํ™”๋ฉด์ด) ๋” ์ด์ƒ ์šฐ๋ฆฌ ์•ž์— ์—†์ง€๋งŒ, ๊ธฐ๊ถŒ(abstain) ์„ ํƒ์ง€๊ฐ€ ์žˆ์—ˆ๋Š”์ง€ ๊ธฐ์–ต๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

DE
๊ทธ๋ƒฅ ํˆฌํ‘œํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
MM

๊ธฐ๊ถŒ(abstain)์„ ์˜๋ฏธํ•œ ๊ฒƒ์ด ์•„๋‹ˆ์—ˆ์Šต๋‹ˆ๋‹ค. Nicolo๊ฐ€ ๋ฐฉ๊ธˆ ์„ค๋ช…ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ํˆฌํ‘œํ–ˆ์Šต๋‹ˆ๋‹ค.

JHD

๋ช…ํ™•ํžˆ ํ•˜์ž๋ฉด, ์ €์—๊ฒŒ ๊ทธ๊ฒƒ์€ ์•ฝํ•œ ๋ถ€์ •์ด๋ฉฐ, ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ํ•ฉ์˜๋ฅผ ๋ง‰์œผ๋ ค๋Š” ์˜์ง€๋Š” ์—†์ง€๋งŒ ์ง€์ง€ ํˆฌํ‘œ๋Š” ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

DE
๋งž์Šต๋‹ˆ๋‹ค. ๋„ค. ๊ทธ ํ•ด์„์ด ๋งž๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
ํ•ฉ์˜๊ฐ€ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.
CDA

์ข‹์Šต๋‹ˆ๋‹ค. Promise.try 2.7๋‹จ๊ณ„ ์ง„์ž… ์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค.

JHD

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋ฐœํ‘œ์ž ์š”์•ฝ: ๋™๊ธฐ์— ๋Œ€ํ•œ ์•ฝ๊ฐ„์˜ ์ฃผ์ €ํ•จ์ด ์žˆ์—ˆ์Œ. ๋‹ค์ˆ˜์˜ ์‚ฌ๋žŒ๋“ค์ด ์œ ์šฉ์„ฑ์— ๋Œ€ํ•ด ํ™•์‹ ํ•˜์ง€ ๋ชปํ–ˆ์ง€๋งŒ, ์•„๋ฌด๋„ ๋ฐ˜๋Œ€ํ•˜์ง€ ์•Š์•˜๊ณ  ์—ฌ๋Ÿฌ ๋ฉค๋ฒ„๋“ค์€ ์œ ์šฉ์„ฑ์„ ํ™•์‹ ํ•จ.

๊ฒฐ๋ก : Promise.try๋Š” 2.7 ๋‹จ๊ณ„์— ์ง„์ž…ํ•จ.

Stage 3 - 2024.06

์—ฌ๊ธฐ์„œ ๋ถ€ํ„ฐ๋Š” ์ด์ œ ๋งŽ์€ ๊ฒƒ๋“ค์ด ํ•ฉ์˜ ๋˜์—ˆ๊ณ , ๊ตฌํ˜„์ด ๋˜๊ธฐ ์‹œ์ž‘ํ–ˆ๊ธฐ์— ํฐ ์ด๊ฒฌ ์—†์ด ์Šน๊ฒฉ๋˜์—ˆ๋‹ค. test262์— ํ…Œ์ŠคํŠธ๊ฐ€ ๋ณ‘ํ•ฉ๋˜์—ˆ๊ณ , ๋ธŒ๋ผ์šฐ์ €๋“ค์ด ๊ตฌํ˜„์„ ์‹œ์ž‘ํ–ˆ๋‹ค. (ECMA-262์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋ž€ ์˜๋ฏธ๋กœ test262๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.) https://github.com/tc39/test262/tree/main/test/built-ins/Promise/try

2024๋…„ 6์›” 11์ผ TC39 ๋ฏธํŒ… ๋‚ด์—ญ - Promise.try 3๋‹จ๊ณ„ ๋…ผ์˜ https://github.com/tc39/notes/blob/main/meetings/2024-06/june-11.md#promisetry-for-stage-3

JHD

์ข‹์Šต๋‹ˆ๋‹ค. ์•ˆ๋…•ํ•˜์„ธ์š”, ์—ฌ๋Ÿฌ๋ถ„. ์ง€๋‚œ ๋ช‡ ๋ฒˆ์˜ ํšŒ์˜์—์„œ ๊ธฐ์–ตํ•˜์‹œ๊ฒ ์ง€๋งŒ, Promise.try๋Š” test262 ํ…Œ์ŠคํŠธ๊ฐ€ ๋ณ‘ํ•ฉ๋˜์—ˆ๊ณ  ์ด๋ฏธ ์—ฌ๋Ÿฌ ์—”์ง„์— ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„๋ก ํ”Œ๋ž˜๊ทธ(flag) ๋’ค์— ์ˆจ๊ฒจ์ ธ ์žˆ์ง€๋งŒ์š”. ์˜ค๋Š˜์€ Stage 4๋ฅผ ์ถ”์ง„ํ•˜๋ ค๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‹น์—ฐํžˆ ๋จผ์ € Stage 3๋ฅผ ๋‹ฌ์„ฑํ•˜๊ณ  ํŠนํžˆ ๋ธŒ๋ผ์šฐ์ €๋“ค์ด ๊ตฌํ˜„ํ•  ์‹œ๊ฐ„์„ ์ข€ ๋” ์ฃผ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ชจ๋“  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์œผ๋‹ˆ ์‰ฝ๊ฒŒ Stage 3๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋„ค. ์Šน๊ฒฉ์„ ์š”์ฒญํ•˜๊ธฐ ์ „์— ์งˆ๋ฌธ ๋Œ€๊ธฐ์—ด์— ์งˆ๋ฌธ์ด ์žˆ๋‚˜์š”?

CDA
๋Œ€๊ธฐ์—ด์— ์งˆ๋ฌธ ์—†์Šต๋‹ˆ๋‹ค.
JHD

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ Stage 3 ์Šน๊ฒฉ์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ์œ„์›๋“ค์ด ์ง€์ง€ ์˜์‚ฌ๋ฅผ ํ‘œ๋ช…ํ•ฉ๋‹ˆ๋‹ค.
CDA

Dan Minor๊ฐ€ Stage 3๋ฅผ ์ง€์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ €๋„ Stage 3๋ฅผ ์ง€์ง€ํ•ฉ๋‹ˆ๋‹ค. RGN๋„ ์ฐฌ์„ฑ(+1)ํ•ฉ๋‹ˆ๋‹ค. Duncan McGregor๋„ ์ฐฌ์„ฑ(+1)ํ•ฉ๋‹ˆ๋‹ค.

MLS
์ €๋„ Stage 3๋ฅผ ์ง€์ง€ํ•ฉ๋‹ˆ๋‹ค.
CDA

์ข‹์Šต๋‹ˆ๋‹ค. Michael Saboff, Tom Kopp๋„ ์ฐฌ์„ฑ(+1)์ด๊ตฐ์š”. ๋ช…ํ™•ํ•˜๊ฒŒ ํ•ฉ์˜๊ฐ€ ์ด๋ฃจ์–ด์ง„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

JHD

์ข‹์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ฐธ์„ํ•˜์ง€ ์•Š์€ SYG์˜ ์˜๊ฒฌ: V8์€ Stage 3 ์ง„์ž…์— ๋Œ€ํ•ด ์šฐ๋ ค ์‚ฌํ•ญ์ด ์—†์Šต๋‹ˆ๋‹ค.

์š”์•ฝ ๋ฐ ๊ฒฐ๋ก : Promise.try๋Š” test262 ํ…Œ์ŠคํŠธ๊ฐ€ ๋ณ‘ํ•ฉ๋˜์—ˆ์œผ๋ฉฐ, Stage 3 ์ง„์ž…์— ๋Œ€ํ•œ ํ•ฉ์˜๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

Stage 4 - 2024.10

2024๋…„ 10์›” ๋“œ๋””์–ด ์ตœ์ข… ์Šน๊ฒฉ์ด ๋˜์—ˆ๋‹ค.

2024๋…„ 10์›” 9์ผ TC39 ๋ฏธํŒ… ๋‚ด์—ญ - Promise.try 4๋‹จ๊ณ„ ๋…ผ์˜ https://github.com/tc39/notes/blob/main/meetings/2024-10/october-09.md#promisetry-for-stage-4

JHD

๋„ค, Promise.try์— ๋Œ€ํ•ด ๋‹ค์‹œ ํ•œ๋ฒˆ ๋ง์”€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์™€ ์„ ํƒ์ ์ธ ๊ฐ€๋ณ€ ์ธ์ž ๋ชฉ๋ก์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ๋งŒ์•ฝ ํ•จ์ˆ˜์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๊ฑฐ๋ถ€๋œ(rejected) ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜๊ฐ€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด, ํ•ด๋‹น ๊ฐ’์„ ํ”„๋กœ๋ฏธ์Šค๋กœ ๊ฐ์‹ธ์„œ ๋ฐ˜ํ™˜(promise-resolve)ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ œ์•ˆ์€ ์ŠคํŽ™ PR์ด ์Šน์ธ๋˜์—ˆ๊ณ , Cloudflare Workers, bun, node, Chrome์— ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Firefox์—์„œ๋Š” ๋ฒ„์ „ 132๋ถ€ํ„ฐ ํ”Œ๋ž˜๊ทธ ์„ค์ • ํ•˜์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, 133 ๋ฐ 134 ๋ฒ„์ „์—์„œ๋Š” ํ”Œ๋ž˜๊ทธ ์—†์ด ์ •์‹ ์ง€์›๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. LibJS, Boa, Kiesel์—๋„ ๊ตฌํ˜„๋˜์—ˆ๊ณ , WebKit์—์„œ๋Š” ํ”Œ๋ž˜๊ทธ ์„ค์ • ํ•˜์— ์ง€์›๋˜๋‹ค๊ฐ€ ์ตœ๊ทผ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Stage 4๋กœ ์Šน๊ฒฉ๋˜๊ธฐ๋ฅผ ํฌ๋งํ•ฉ๋‹ˆ๋‹ค.

๋” ์ด์ƒ ์งˆ๋ฌธ์€ ์—†์Šต๋‹ˆ๋‹ค.
JHD

์ด ์ œ์•ˆ์„ ์ง€์ง€ํ•˜์‹œ๋Š” ๋ถ„ ๊ณ„์‹ ๊ฐ€์š”?

๋‹ค์ˆ˜์˜ ์œ„์›๋“ค์ด ์ง€์ง€๋ฅผ ํ‘œ๋ช…ํ•ฉ๋‹ˆ๋‹ค.
CDA

NRO, OMT, YSV ๋‹˜์„ ํฌํ•จํ•ด ๋งŽ์€ ๋ถ„๋“ค์ด ์ง€์ง€ ์˜์‚ฌ๋ฅผ ํ‘œํ•ด์ฃผ์…จ์Šต๋‹ˆ๋‹ค.

JHD

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

CDA

LGH ๋‹˜์€ โ€œ์„ธ ๊ตฐ๋ฐ๋‚˜ ๊ตฌํ˜„์— ์ฐธ์—ฌํ•ด์„œ ํŽธํ–ฅ๋œ ์˜๊ฒฌ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ฐฌ์„ฑํ•ฉ๋‹ˆ๋‹คโ€๋ผ๊ณ  ํ•˜์…จ๊ณ , RKG ๋‹˜์€ โ€œ์™€์šฐ!โ€, MF ๋‹˜์€ โ€œ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹คโ€๋ผ๊ณ  ํ•˜์…จ์Šต๋‹ˆ๋‹ค.

JHD

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

CDA

KM ๋‹˜๋„ ์ฐฌ์„ฑํ•˜์…จ์Šต๋‹ˆ๋‹ค. ์ €๋„ ์ง€์ง€ํ•ฉ๋‹ˆ๋‹ค. ํ˜น์‹œ ๋” โ€œ๋งŒ์„ธโ€๋‚˜ โ€œ์•ผํ˜ธโ€ ๊ฐ™์€ ๋ฐ˜์‘์€ ์—†๋‚˜์š”? WH ๋‹˜๋„ ์ฐฌ์„ฑํ•˜์…จ์Šต๋‹ˆ๋‹ค. KM ๋‹˜, Tom ๋‹˜๋„ ์ฐฌ์„ฑํ•˜์…จ์Šต๋‹ˆ๋‹ค. ๋„ค, ๊ฑฐ์˜ ๋‹ค ๋œ ๊ฒƒ ๊ฐ™๋„ค์š”. ๊ธฐ์ค€์„ ๋„˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก : Stage 4 ์Šน๊ฒฉ์„ ์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ ๋˜์—ˆ์„๊นŒ?

๋ฏธํŒ…๋…ธํŠธ๋ฅผ ์ญ‰ ๋”ฐ๋ผ์˜ค๋ฉด์„œ ์ œ์•ˆ์ด ๋ฐœ์˜๋˜๊ณ  ์ตœ์ข… ์Šน์ธ๋˜๊ธฐ ๊นŒ์ง€ ๊ณผ์ •์„ ์‚ดํŽด๋ณด์•˜๋‹ค.
๊ทธ๋ ‡๋‹ค๋ฉด ์‹ค์ œ ๊ตฌํ˜„์€ ์–ด๋–ป๊ฒŒ ์ด๋ค„์ ธ์žˆ์„๊นŒ? ๋จผ์ € ์ŠคํŽ™์„ ์‚ดํŽด๋ณด์ž.

Promise.try

No description available

https://tc39.es/proposal-promise-try/#sec-promise.try

๋ฒˆ์—ญํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

์ŠคํŒฉ์˜ ์˜์‚ฌ์ฝ”๋“œ ์ฝ๋Š” ๋ฒ•์€ ์•„๋ž˜์˜ ๋‘ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•ด๋ณด์ž

ECMAScriptยฎ 2026 Languageย Specification

No description available

https://tc39.es/ecma262/multipage/notational-conventions.html#sec-algorithm-conventions
ECMAScriptยฎ 2026 Languageย Specification

How to Read the ECMAScript Specification

No description available

https://timothygu.me/es-howto/

๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•ด๋ณด์ž๋ฉด callback์„ ๋ฐ›์•„์„œ ์‹คํ–‰ํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ Promise๋กœ ๋งŒ๋“ค์–ด์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ž ๊ทธ๋Ÿผ ๋ฐ”๋กœ v8์ƒ์˜ ๊ตฌํ˜„์œผ๋กœ ๋„˜์–ด๊ฐ€๋ณด์ž. ์ผ๋‹จ์€ ์ฃผ์„์— ์ง‘์ค‘ํ•ด๋ณด์ž.

https://source.chromium.org/chromium/chromium/src/+/main:v8/src/builtins/promise-try.tq\ https://github.com/v8/v8/blob/main/src/builtins/promise-reaction-job.tq

// Copyright 2024 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

namespace promise {

// https://tc39.es/proposal-promise-try/#sec-promise.try
@incrementUseCounter('v8::Isolate::kPromiseTry')
transitioning javascript builtin PromiseTry(
    js-implicit context: Context, receiver: JSAny)(...arguments): JSAny {
  // 1. Let C be the this value.
  // 2. If C is not an Object, throw a TypeError exception.
  const receiver = Cast<JSReceiver>(receiver)
      otherwise ThrowTypeError(MessageTemplate::kCalledOnNonObject, 'Promise.try');

  // 3. Let promiseCapability be ? NewPromiseCapability(C).
  const capability = NewPromiseCapability(receiver, False);

  // 4. Let status be Completion(Call(callbackfn, undefined, args)).
  const callbackfn = arguments[0];
  let result: JSAny;
  try {
    if (arguments.length <= 1) {
      result = Call(context, callbackfn, Undefined);
    } else {
      const rest = NewRestArgumentsFromArguments(arguments, 1);
      result = Call(
          context, GetReflectApply(), Undefined, callbackfn, Undefined, rest);
    }
  } catch (e, _message) {
    // 5. If status is an abrupt completion, then
    //   a. Perform ? Call(promiseCapability.[[Reject]], undefined, ยซ
    //      status.[[Value]] ยป).
    Call(context, UnsafeCast<Callable>(capability.reject), Undefined, e);

    // 7. Return promiseCapability.[[Promise]].
    return capability.promise;
  }

  // 6. Else,
  //   a. Perform ? Call(promiseCapability.[[Resolve]], undefined, ยซ
  //      status.[[Value]] ยป).
  Call(context, UnsafeCast<Callable>(capability.resolve), Undefined, result);

  // 7. Return promiseCapability.[[Promise]].
  return capability.promise;
}

}  // namespace promise

v8 ์ƒ์˜ ์ฝ”๋“œ๋ฅผ ์ž˜ ๋ณด๋ฉด ์œ„์—์„œ ์‚ดํŽด๋ณธ ์ŠคํŽ™์˜ ์˜์‚ฌ์ฝ”๋“œ๊ฐ€ ๊ทธ๋Œ€๋กœ ์ฃผ์„์œผ๋กœ ์ฝ”๋“œ์ƒ์— ๊ธฐ๋ก๋˜์–ด์žˆ๋‹ค.
์–ผ์ถ” ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์ฃผ์„์˜ ์˜์‚ฌ์ฝ”๋“œ์™€ ๊ฑฐ์˜ ๋™์ผํ•˜๊ฒŒ ๊ตฌํ˜„๋˜์–ด์žˆ๋Š”๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด ์ฝ”๋“œ๋Š” typescript์ฒ˜๋Ÿผ ๋‹ฎ์•˜๋Š”๋ฐ ํ™•์žฅ์ž๋ฅผ ๋ณด๋ฉด tq๋ผ๋Š” ํ™•์žฅ์ž๋ฅผ ์“ฐ๊ณ  ์žˆ๋‹ค. ์ด๋•Œ ์ด tq๋Š” torque์˜ ์ค„์ž„๋ง์ด๋‹ค.
๋ง‰์ƒ ๊ตฌํ˜„์„ ์ฐพ์•„๋ดค์„๋•Œ c++์„ ๋งˆ์ฃผํ•  ์ค„ ์•Œ์•˜๋Š”๋ฐ torque๋ผ๋Š” ์–ธ์–ด๋Š” ๋„๋Œ€์ฒด ๋ฌด์—‡์ธ๊ฐ€?

Torque

Torque๋Š” v8 ์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” DSL(Domain Specific Language)์ด๋‹ค.
Torque์˜ ๋ฉ”๋‰ด์–ผ์„ ์ฐธ๊ณ ํ•ด๋ณด๋ฉด ์œ„์˜ ์˜๋ฌธ์— ๋Œ€ํ•œ ๋‹ต์ด ๋‚˜์˜จ๋‹ค. (https://v8.dev/docs/torque)

V8 Torque is a language that allows developers contributing to the V8 project to express changes in the VM by focusing on the intent of their changes to the VM, rather than preoccupying themselves with unrelated implementation details. The language was designed to be simple enough to make it easy to directly translate the ECMAScript specification into an implementation in V8, but powerful enough to express the low-level V8 optimization tricks in a robust way, like creating fast-paths based on tests for specific object-shapes.

V8 Torque๋Š” V8 ํ”„๋กœ์ ํŠธ์— ๊ธฐ์—ฌํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ์–ฝ๋งค์ด์ง€ ์•Š๊ณ  โ€œ๋ฌด์—‡์„ ๋ฐ”๊พธ๊ณ  ์‹ถ์€์ง€โ€ ๊ทธ ์˜๋„์— ์ง‘์ค‘ํ•ด VM ๋กœ์ง์„ ์ž‘์„ฑํ•˜๋„๋ก ๋•๋Š” ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ECMAScript ์‚ฌ์–‘์„ V8 ์ฝ”๋“œ๋กœ ์†์‰ฝ๊ฒŒ ์˜ฎ๊ธธ ๋งŒํผ ๋‹จ์ˆœํ•˜๋ฉด์„œ๋„, ํŠน์ • ๊ฐ์ฒด ํ˜•ํƒœ๋ฅผ ํŒ๋ณ„ํ•ด ๋น ๋ฅธ ์‹คํ–‰ ๊ฒฝ๋กœ๋ฅผ ๋งŒ๋“œ๋Š” ๋“ฑ V8์˜ ์ €์ˆ˜์ค€ ์ตœ์ ํ™” ๊ธฐ๋ฒ•๋„ ํŠผํŠผํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์„ ์ •๋„๋กœ ๊ฐ•๋ ฅํ•˜๊ฒŒ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Torque์˜ ๋ชฉ์  ์ž์ฒด๊ฐ€ ๊ธฐ์กด ๊ตฌํ˜„์— ์žˆ์–ด์„œ ์กฐ๊ธˆ๋” human readableํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ์— ๋Œ€ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ตœ๋Œ€ํ•œ ์ŠคํŽ™์˜ ์˜์‚ฌ์ฝ”๋“œ์˜ ์˜๋„๋ฅผ ๊ทธ๋Œ€๋กœ ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์กŒ๋‹ค.

ํƒ„์ƒ ๋ฐฐ๊ฒฝ

์ดˆ์ฐฝ๊ธฐ V8์€ ๋‚ด์žฅ ํ•จ์ˆ˜๋ฅผ ๋Œ€๋ถ€๋ถ„ ์…€ํ”„-ํ˜ธ์ŠคํŒ… JavaScript(V8 ์ „์šฉ ๋ฐฉ์–ธ)๋กœ ์ž‘์„ฑ๋˜์—ˆ๋‹ค. ์ด ๋ฐฉ์‹์ด ๊ดœ์ฐฎ๊ธดํ–ˆ๋Š”๋ฐ, Array์˜ ๋ฉ”์„œ๋“œ๋“ค ๊ฐ™์ด ํ˜ธ์ถœ์ด ์žฆ๊ณ  ์‚ฌ์–‘์ด ๋ณต์žกํ•œ ํ•จ์ˆ˜๋“ค์€ ์›Œ๋ฐ์—… ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ ๋นจ๋ผ์ง€๊ณค ํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋Ÿฐ ํ•ต์‹ฌ ๋‚ด์žฅ์„ ์•„ํ‚คํ…์ฒ˜๋ณ„ ์–ด์…ˆ๋ธ”๋ฆฌ๋กœ ์ง์ ‘ ์งœ์„œ **โ€œ์ฒซ ํ˜ธ์ถœ๋ถ€ํ„ฐ ์ตœ๊ณ  ์„ฑ๋Šฅโ€**๋‚ด๋ ค๊ณ  ์—ด์‹ฌํžˆ ์ž‘์„ฑ๋˜์—ˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ฌธ์ œ๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ๋กœ ์ž‘์„ฑํ•˜๋‹ค๋ณด๋‹ˆ ๊ฐ ํ”Œ๋žซํผ๋งˆ๋‹ค ์ˆ˜๋งŒ ์ค„์”ฉ ์ฝ”๋“œ๋ฅผ ๋ณต์ œํ•ด์•ผ ํ–ˆ๊ณ , ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์ ์  ํž˜๋“ค์–ด์ง€๊ฒŒ ๋˜์—ˆ๋‹ค.

2015๋…„ TurboFan ์ตœ์ ํ™” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋„์ž…๋˜๋ฉด์„œ ์ƒํ™ฉ์ด ๋‹ฌ๋ผ์ง€๊ฒŒ ๋œ๋‹ค. TurboFan ๋ฐฑ์—”๋“œ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๊ณตํ†ต ์ €์ˆ˜์ค€ IR์„ ์‚ฌ๋žŒ์ด ์ง์ ‘ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ํ•œ C++ DSL **CodeStubAssembler(CSA, 2016)**๊ฐ€ ๋“ฑ์žฅํ•˜๊ฒŒ ๋œ๋‹ค. ๋•๋ถ„์— ํ•œ ๋ฒˆ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๊ฐ€ ๋ชจ๋“  ํ”Œ๋žซํผ์— ์ตœ์ ํ™”๋œ ์–ด์…ˆ๋ธ”๋ฆฌ๋กœ ๋ณ€ํ™˜๋˜์—ˆ๊ณ , ๋งŽ์€ ์ˆ˜์ œ ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๋“ค์„ ๊ฑท์–ด๋‚ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ CSA์กฐ์ฐจ ์‚ฌ๋žŒ์ด ์ผ์ผ์ด ์จ์•ผ ํ•ด ์—ฌ์ „ํžˆ ์–ด๋ ต๊ธดํ–ˆ๊ณ , ๊ทธ๋กœ์ธํ•œ ๋ฆฌ์Šคํฌ๋„ ์กด์žฌํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ 2019๋…„, ECMAScript ์˜์‚ฌ์ฝ”๋“œ๋ฅผ ๊ฑฐ์˜ ๊ทธ๋Œ€๋กœ ๋ฒ ๊ปด ์“ฐ๋ฉด ๋‚˜๋จธ์ง€ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ์™€ ์•ˆ์ „ ๊ฒ€์‚ฌ๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™ ์ƒ์„ฑํ•˜๋„๋ก ํ•˜๋Š” ์ƒ์œ„ DSL Torque๊ฐ€ ๋“ฑ์žฅํ•˜๊ฒŒ ๋˜์—ˆ๋˜ ๊ฒƒ์ด๋‹ค. Torque ์ฝ”๋“œ๋Š” ์ค‘๊ฐ„ ๋‹จ๊ณ„์ธ CSA C++ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜๋˜๊ณ , TurboFan์ด ๋‹ค์‹œ ๋จธ์‹  ์ฝ”๋“œ๋กœ ๋ฐ”๊ฟ”์ฃผ๊ฒŒ ๋œ๋‹ค.

์ •๋ฆฌํ•˜๋ฉด JS ์…€ํ”„-ํ˜ธ์ŠคํŒ… โ†’ ์–ด์…ˆ๋ธ”๋ฆฌ fast-path โ†’ CSA(CodeStubAssembler) โ†’ Torque ์ˆœ์œผ๋กœ ๊ฒน๊ฒน์ด ์ƒ๊ฒจ๋‚œ ์…ˆ์ด๋‹ค.

๊ตฌ์ฒด์ ์ธ ๋‚ด์šฉ์€ ์•„๋ž˜์˜ Tobias Tebbi์˜ ๋ฐœํ‘œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์ž˜ ๋‚˜์™€์žˆ๋‹ค.

https://www.jfokus.se/jfokus20-preso/V8-Torque--A-Typed-Language-to-Implement-JavaScript.pdf

No description available

https://www.jfokus.se/jfokus20-preso/V8-Torque--A-Typed-Language-to-Implement-JavaScript.pdf

๊ทธ๋ ‡๋‹ค๋ฉด torque๋กœ ๊ตฌํ˜„๋œ ์ฝ”๋“œ๋Š” ์–ด๋–ป๊ฒŒ ๋ณ€ํ™˜๋ ๊นŒ?
v8๋‚ด ์†Œ์Šค๋ฅผ ๋ณด๋ฉด torque์˜ ์ปดํŒŒ์ผ๋Ÿฌ๋„ ์กด์žฌํ•œ๋‹ค. https://github.com/v8/v8/blob/main/src/torque/torque-compiler.cc

์ด๋ฆ„์˜ ์œ ๋ž˜

V8๊ณผ ๊ด€๋ จ๋œ ํˆด๋“ค์˜ ์ด๋ฆ„์€ ๋Œ€๋ถ€๋ถ„ ์—”์ง„๊ณผ ๊ด€๋ จ๋œ ์šฉ์–ด๋“ค๋กœ ์ง€์–ด์ง„๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ Ignition, Sparkplug, TurboFan ๋“ฑ์ด ์žˆ๋‹ค. ํ† ํฌ๋„ ํšŒ์ „๋ ฅ์„ ์˜๋ฏธํ•˜๊ธฐ์— ์—”์ง„์˜ ํž˜์„ ์˜๋ฏธํ•˜๊ธด ํ•˜์ง€๋งŒ, ๋‹ค๋ฅธ ์ž‘๋ช…์— ๋น„ํ•ด ์—„์ฒญ ์™€๋‹ฟ์ง€๋Š” ์•Š๋Š” ๊ฑฐ ๊ฐ™๋‹ค. ์ง์ ‘์ ์œผ๋กœ ์—”์ง„๊ณผ ๊ด€๋ จ๋˜์—ˆ๋‹ค๊ธฐ ๋ณด๋‹จ, ํ† ํฌ๋ฅผ ๊ฐ€ํ•ด์„œ CSA๋กœ ๋น„ํ‹€์–ด์ค€๋‹ค๋Š” ๊ทธ๋Ÿฐ ์€์œ ๊ฐ€ ์•„๋‹๊นŒ?

ํ 

Promise.try์˜ ์“ธ๋ชจ๋ฅผ ์ฐพ์•„๋ณด๋‹ค๊ฐ€ ์ด๊ฒƒ ์ €๊ฒƒ ๋งŽ์€ ๊ฒƒ๋“ค์„ ์‚ดํผ๋ณด์•˜๋‹ค. ์ œ์•ˆ๊ณผ์ •์„ ์‚ดํŽด๋ณผ๋•Œ ์—ฌ๋Ÿฌ๋ฒˆ์˜ ์˜๋ฌธ์ œ๊ธฐ๋ฅผ ๋งž๋Š” ๊ฒƒ์„ ๋ณด๋ฉฐ, ๊ดœ์‹œ๋ฆฌ ๋‚ด๊ฐ€ ๋” ์ˆจ์ด ๋ง‰ํ˜€์™”๋‹ค. ์–ด๋–ค์‹์œผ๋กœ ์—ฌ๋Ÿฌ ๋ฉ”์„œ๋“œ๋“ค์ด ์šฐ๋ฆฌ์—๊ฒŒ ๋„์ฐฉํ•˜๊ฒŒ ๋˜๋Š”์ง€ ๊ถ๊ธˆํ•œ ์ด์—๊ฒŒ ๋„์›€์ด ๋˜์—ˆ๊ธธ ๋ฐ”๋ž€๋‹ค.

์ฐธ๊ณ  ๋ฌธํ—Œ

  1. Promise.try - MDN Web Docs
  2. Promise.try() support now enabled in Chrome (web.dev)
  3. TC39 Proposal - Promise.try specification
  4. Original TC39 Promise.try Proposal README
  5. Bluebird - Promise.try documentation
  6. What is Promise.try, and why does it matter? (Joepie91โ€™s blog)
  7. GitHub - TC39 Promise.try issue discussion
  8. V8 Torque documentation
  9. V8 Torque Builtins documentation
  10. V8 CodeStubAssembler blog post
  11. Chromium Source - Promise.try implementation in Torque
  12. V8 Torque Compiler source code
  13. Jfokus 2020 - V8 Torque: A Typed Language to Implement JavaScript (slides)
  14. Tobias Tebbi - V8 Torque: A Typed Language to Implement JavaScript (YouTube)
RSS ๊ตฌ๋