Promise.try(), ๊ทธ๋ฆฌ๊ณ Torque๋ฅผ ๊ณ๋ค์ธ
Promise.try๊ฐ ์ด์ ๊ธฐ์ค์ผ๋ก ์๋ก ์ ๊ณต๋ฉ๋๋ค. ย |ย Articles ย |ย web.dev ์ด์ Promise.try๊ฐ ๋ชจ๋ ์ฃผ์ ๋ธ๋ผ์ฐ์ ์์ง์ ์ถ์๋์ด ๊ธฐ์ค์ ์๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
https://web.dev/blog/promise-try-baseline?hl=ko
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) ์ ์คํ ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ๋ค.
Promise.resolve()๋ ์ด๋ฏธ fulfilled ์ํ์ธ ํ๋ผ๋ฏธ์ค ๋ฅผ ์ฆ์ ๋ฐํํ๋ค.
.then(f)๋ f๋ฅผ onFulfilled ํธ๋ค๋ฌ๋ก ๋ฑ๋กํ๊ณ , ํด๋น Reaction Job ์
microtask ํ์ ๋ฃ๋๋ค.
ํ์ฌ ์ฝ์คํ์ด ๋ชจ๋ ๋น์์ง ๋ค, ์ด๋ฒคํธ ๋ฃจํ๊ฐ ๊ทธ microtask๋ฅผ ์ฒ๋ฆฌํ๋ฉด์ f
๋ฅผ ์คํํ๋ค.
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๋ก ๊ฐ์ธ์ฃผ๋ ์ญํ ๋ง ํ ๋ฟ ์ผ์ข
์ ํธ๋ฆญ์ด๋ค.
์ฐ๋ฆฌ๊ฐ ์๊ณ ์ถ์ ๊ฒ์ readFile ์ด ์๋๋ฉด parse ๋ฅผ ํ๊ณ , ์๋ฌ๊ฐ ๋๋ฉด
์๋ฌ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ๋ฟ์ด๋ค
๋น์์๋ ์ด๋ฐ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ง๊ธ์ 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
๋น์์ ๊ทผ๊ฑฐ๋ ์๊น ์ดํด๋ณธ ์์๋๋ก ์๊น์ ์์ง ๋ชปํ๋ ํจ์๋ค์ ๋ํด์ ๋ถํ์ํ 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๊ฐ ์์๊น์?
MM
Promise ํ์ดํ๋ผ์ด๋์ ์ํ Promise.post/send/get ๋ฑ์ด์.
BT
ํ์ง๋ง ๋น๋๊ธฐ ํจ์๋ก ๊ตฌํํ ์ ์๋ ๊ฒ๋ค์ ์ด๋ค๊ฐ์?
MM
์ ๊ฐ ํฌ๊ด์ ์ผ๋ก ๋งํ๋ ๊ฒ์ ์๋์ง๋ง, ๋น๋๊ธฐ ํจ์๋ ๊ธฐ์ค์ ๋งค์ฐ ๋์์ต๋๋ค. ๋น๋๊ธฐ ํจ์์ ๋น๊ตํ์ ๋ ๊ฐ๋ ฅํ ๊ทผ๊ฑฐ๊ฐ ์๊ณ ๋ง์ ๊ฐ์น๋ฅผ ๋ํด์ผ ํ ๊ฒ๋๋ค.
JHD
ํธ๋์คํ์ผ๋ฌ(transpiler)์ ์๊ด์์ด, ์๋ก์ด ๊ธฐ๋ฅ์ ๋์
ํ๋ ๋ฐ๋ ์ฅ๋ฒฝ์ด ์์ต๋๋ค. ๋น๋๊ธฐ ํจ์๋ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ธฐ๋ฅ๋ณด๋ค ๋์
ํ๊ธฐ ๋ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ์ ํฌ AirBnB์์๋ regenerator ์์กด์ฑ์ ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋น๋๊ธฐ ํจ์๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค.
AR
์ฌ๋๋ค์ด Promise๋ ๋น๋๊ธฐ ํจ์์ ๊ฐ์ด ์ดํดํ๊ธฐ ์ฌ์ด ๊ณตํต ๊ธฐ๋ฐ ์์์ ์ ์ง์ ์ผ๋ก ์ฑํํ ์ ์๋ ๋ค์ํ ๊ธฐ๋ฅ์ ๊ฐ๋ ๊ฒ์ด ์ข์ต๋๋ค.
JHD
new Promise๋ ์ดํดํ๊ธฐ ์ด๋ ต์ต๋๋ค.
YK
์ ๊ฐ ๋น๋๊ธฐ ํจ์๋ฅผ ์ฌ์ฉํ๋ ํ๋ก์ ํธ๋ฅผ ํ ๋, ํญ์ ๋น๋๊ธฐ ํจ์๋ง ์ฐ๊ณ ์ถ์ง ์์ ๊ฒฝ์ฐ๋ฅผ ์ฐพ๊ธฐ ์ด๋ ต์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ธ์ง์ ๋ถ๋ด(cognitive overhead)๋ ํจ์ฌ ์ ์ต๋๋ค.
์๊ฐ ์ ํ ์๋ฆผ
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)์ ๋ชจ๋ฅด๋ ํจ์์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๊ฒฝ ์ฐ๊ณ ์ถ์ง๋ ์๊ณ ์. ๊ทธ๋ฅ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐ์์ ์ต์ ์ ๋คํด ์ฒ๋ฆฌํ๊ณ ์ถ์ต๋๋ค.
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๋ฅผ ์ฌ์ฉํ๋ ํ๋ก๋ฏธ์ค ํ์ดํ๋ผ์ธ
์์ ์๋ ์ํ์ฃ .
JHD
๋ฐ๋ฉด Promise.try๋ ํ๋ก๋ฏธ์ค ํ์ดํ๋ผ์ธ์ ์์ฑํ๊ฑฐ๋ ์ง์
ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
JHD
๊ทธ๋์ ๋์ํฉ๋๋ค โ ํ๋ฉด์ ์ผ๋ก๋ ๋น์ทํด ๋ณด์ด์ฃ . ํ์ง๋ง ์ ์๊ฐ์๋ then,
catch, finally API์ ๊ตฌ๋ฌธ(async/await) ๊ฐ์ ์ ์ฌ์ฑ์ด Promise.try ๋
then/catch/finally๋ณด๋ค ๋ ์ค์ํ๋ค๊ณ ๋ด
๋๋ค. ์ค๋ น ๊ฐ๋
์ ์ผ๋ก ๋ค๋ฅด์ง ์๋ค๊ณ
ํด๋ ๋ง์ด์ฃ (์ ๋ ๋ค๋ฅด๋ค๊ณ ์๊ฐํฉ๋๋ค).
MM
๋ค. ๋ฐ์๋ค์ด๊ฒ ์ต๋๋ค. ์ข์ ๊ทผ๊ฑฐ์ธ ๊ฒ ๊ฐ๋ค์.
MM
๋ค๋ฅธ ์ง๋ฌธ์ด ์์ต๋๋ค. Promise.try๋ ์ฝ๋๋ฅผ async IIFE(์ฆ์ ์คํ ๋น๋๊ธฐ ํจ์)๋ก
๊ฐ์ธ๋ ๊ฒ๊ณผ ๋์ผํ๊ฐ์?
JHD
๋ค. (ํ์ดํํ๋ฉฐ ๋ณด์ฌ์ค)
MM
async IIFE์์ ๋์นญ์ฑ์ ๊ณ ๋ คํ ๋, ์ ์ฌ๋๋ค์ด async IIFE๋ฅผ ์ฌ์ฉํ๋๋ก
๊ถ์ฅํ๋ ๋์ try๋ฅผ ์ถ๊ฐํ ๊ฐ์น๊ฐ ์๋์ง ์ค๋ช
ํด์ฃผ์ญ์์ค.
JHD
๋ฌผ๋ก ์
๋๋ค. ์ด ๋ด์ฉ์ 1๋จ๊ณ ๋
ผ์์ ์ฝ ๋ ์ฐจ๋ก์ ํ ๋ก ์์ ๋ค๋ฃจ์ด์ก์ต๋๋ค.
ํ์ง๋ง ๋ณธ์ง์ ์ผ๋ก, ์ฒซ ๋ฒ์งธ ์ด์ ๋ ์ค๋๋ ํ๊ฒฝ์ ์ง์ํด์ผ ํ ๊ฒฝ์ฐ,
๊ตฌ๋ฌธ(syntax)์ ํธ๋์คํ์ผ ๋น์ฉ์ด ๋ ๋น์ธ๋ค๋ ๊ฒ์
๋๋ค. ํ์ง๋ง ๋ค๋ฅธ ์ ์, ๊ทธ
์ง๋ฌธ ๋๋ฌธ์ ์ด ์ ์์ด 1๋จ๊ณ์์ ๊ฑฐ์ 9๋
๋์ ๋ฉ์ถฐ ์์๋ค๋ ๊ฒ์
๋๋ค. ์ด
๊ธฐ๋ฅ(ํด๋ฆฌํ ๋ฑ)์ 440์ต ๋ค์ด๋ก๋๋ฅผ ๊ธฐ๋กํ์ต๋๋ค. ํจ์ ํํ๊ฐ ๋จ์ํ async
IIFE๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ๋ง์ ์ฌ๋๋ค์๊ฒ ์ ํธ๋๊ฑฐ๋ ํ์ํ๋ค๋ ๊ฒฝํ์ ์ฆ๊ฑฐ๊ฐ
์์ต๋๋ค. ์ ์ฃผ๊ด์ ์ธ ๋ฏธ์ ๊ฒฌํด๋ก๋, ์ฆ์ ์คํ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
์ง์ ๋ถํ๋ฉฐ, ๋ชจ๋์ด ์๋ ํ๊ฒฝ์์๋ ๊ตฌ์ ๋ฐฉ์์ด ๋์๊ณ ์ ๋ ๊ทธ๋ ๊ฒ ์ ์ง๋๊ธฐ๋ฅผ
์ ํธํฉ๋๋ค. ์ด๊ฒ์ ์ฃผ๊ด์ ์ธ ์๊ฒฌ์ด๋ฉฐ ์๋ฌด๋ ๋์ํ ํ์๋ ์์ต๋๋ค. ์ด๊ฒ์
ํด๋น ํจํค์ง์ ๊ทธ ๊ธฐ๋ฅ์ด ์ ๊ณตํ๋ ๊ฒ์ ์ ๊ฐ (ํ์คํ๋ฅผ ํตํด) ๋ถํ์ํ๊ฒ ๋ง๋ค๋ ค๊ณ
ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
MM
๊ฒฝํ์ ์ฆ๊ฑฐ๊ฐ ๋ง์์ ๋ญ๋๋ค. ๋ฐ๋ํ์ง ์์ต๋๋ค.
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
๋ง์ต๋๋ค. ๋น์ ๋ง์ด ์ณ์ต๋๋ค. ์ ๊ฐ ๊ทธ๊ฒ์ ์ธ๊ธํ ๊ฒ์ด ๋ ๋ง์ ํผ๋์ ์ผ๊ธฐํ ๊ฒ
๊ฐ์ต๋๋ค.
JHD
๋ค. ํด๋ฆฌํ ๊ฐ๋ฅ์ฑ์ ์์ํ๋ก์ ์ฐ๋ฆฌ๊ฐ ์ค๊ณ ๊ฒฐ์ ์ ๋๊ธฐ ๋ถ์ฌํ๊ฑฐ๋ ์ด๋ค ๊ฒ์
ํฌํจ์ ์ ๋นํํ๋ ๊ฒ์ผ๋ก ํฉ์ํ ์ ์ด ์๋ ๋๊ธฐ์ด๋ฉฐ, ์ฌ๊ธฐ์ ์ ๊ฐ ๊ทธ๋ ๊ฒ
์ฃผ์ฅํ๋ ๊ฒ์ ์๋๋๋ค.
KG
์ ๊ฐ ํ์ธํ๊ณ ์ถ์๋ ๊ฒ์ ๊ทธ๋ฟ์
๋๋ค.
DRR
์ ๋ง์, ์ฌ๊ธฐ์ ์ฃผ์ฅ ์ค ํ๋๋ ๋ช
ํ์ฑ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ โ ์ ๋ ์ด ์ฌ์ฉ
์ฌ๋ก์ ๋ํด ์์ ํ ํ์ ์ด ์์ง๋ ์์ต๋๋ค. ํ์ง๋ง ๋ง์ฝ ์ฐ๋ฆฌ๊ฐ ์ด๊ฒ์ ์ถ์งํ๊ณ
์ ์ฒด ๋ชฉํ๊ฐ ๋ช
ํ์ฑ์ด๋ผ๋ฉด, try๋ผ๋ ์ด๋ฆ์ ์ ๋ง๋ก ํ๋ก๋ฏธ์ค์ ๊ด๋ จํ์ฌ ์ด๋ค
์์ผ๋ก๋ ์์ธ(exception)์ ๊ด๋ จ์ด ์๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.
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
์จ๋ ์ฒดํฌ๋ฅผ ํฉ์๋ค.
์จ๋ ์ฒดํฌ๋ฅผ ์ํ ๋
ผ์๊ฐ ์งํ๋ฉ๋๋ค.
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 ๋จ๊ณ์ ๋ํ ํฉ์๋ฅผ ๋ค์ ์์ฒญํ๊ฒ ์ต๋๋ค.
์ฌ๋ฌ ์ฐธ์์๋ค์ด ์ง์ง ์์ฌ๋ฅผ ํ๋ช
ํฉ๋๋ค.
CDA
TKP๋ก๋ถํฐ +1์
๋๋ค. ์ข์ต๋๋ค. ๋ฐ๋ํ๋ ๋ถ ๊ณ์ ๊ฐ์? ๋ช
์์ ์ผ๋ก ๋ฐ๋ํ์ง๋
์์ง๋ง ๊ธฐ๋ก์ ์ํด ๋ค๋ฅธ ์๊ฒฌ์ ๋ฐํ๊ณ ์ถ์ ๋ถ ๊ณ์ ๊ฐ์?
DE
์ ๋ Mark๊ฐ โ๋ฌด๊ด์ฌ(indifferent)โ์ ๊ธฐ๊ถ(abstain)์ผ๋ก ํด์ํ ๊ฒ์ ๋ํด ์ฝ๊ฐ
๋ฐ๋ ์๊ฒฌ์ ํํ๊ณ ์ถ์ต๋๋ค. ๊ธฐ๊ถํ๊ณ ์ถ์ผ๋ฉด ๊ธฐ๊ถํ ์ ์์ต๋๋ค. ์ ๋ Nicolo๊ฐ
๋งํ ์๋ฏธ๋ก โ๋ฌด๊ด์ฌโ์ ํฌํํ์ง๋ง, ํฉ์์ ๋ฐ๋ํ๋ ๊ฒ์ ์๋๋๋ค.
MM
(ํฌํ ํ๋ฉด์ด) ๋ ์ด์ ์ฐ๋ฆฌ ์์ ์์ง๋ง, ๊ธฐ๊ถ(abstain) ์ ํ์ง๊ฐ ์์๋์ง
๊ธฐ์ต๋์ง ์์ต๋๋ค.
DE
๊ทธ๋ฅ ํฌํํ์ง ์์ผ๋ฉด ๋ฉ๋๋ค.
MM
๊ธฐ๊ถ(abstain)์ ์๋ฏธํ ๊ฒ์ด ์๋์์ต๋๋ค. Nicolo๊ฐ ๋ฐฉ๊ธ ์ค๋ช
ํ ๊ฒ๊ณผ ๊ฐ์
์ด์ ๋ก ํฌํํ์ต๋๋ค.
JHD
๋ช
ํํ ํ์๋ฉด, ์ ์๊ฒ ๊ทธ๊ฒ์ ์ฝํ ๋ถ์ ์ด๋ฉฐ, ๋๊ตฐ๊ฐ๊ฐ ํฉ์๋ฅผ ๋ง์ผ๋ ค๋ ์์ง๋
์์ง๋ง ์ง์ง ํฌํ๋ ํ์ง ์์ ๊ฒ์ด๋ผ๋ ์๋ฏธ์
๋๋ค.
DE
๋ง์ต๋๋ค. ๋ค. ๊ทธ ํด์์ด ๋ง๋ ๊ฒ ๊ฐ์ต๋๋ค.
ํฉ์๊ฐ ์ด๋ฃจ์ด์ง๋๋ค.
CDA
์ข์ต๋๋ค. Promise.try 2.7๋จ๊ณ ์ง์
์ถํํฉ๋๋ค.
๋ฐํ์ ์์ฝ: ๋๊ธฐ์ ๋ํ ์ฝ๊ฐ์ ์ฃผ์ ํจ์ด ์์์. ๋ค์์
์ฌ๋๋ค์ด ์ ์ฉ์ฑ์ ๋ํด ํ์ ํ์ง ๋ชปํ์ง๋ง, ์๋ฌด๋ ๋ฐ๋ํ์ง ์์๊ณ ์ฌ๋ฌ ๋ฉค๋ฒ๋ค์
์ ์ฉ์ฑ์ ํ์ ํจ.
๊ฒฐ๋ก : 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 ๋์ ํฌํจํด ๋ง์ ๋ถ๋ค์ด ์ง์ง ์์ฌ๋ฅผ ํํด์ฃผ์
จ์ต๋๋ค.
CDA
LGH ๋์ โ์ธ ๊ตฐ๋ฐ๋ ๊ตฌํ์ ์ฐธ์ฌํด์ ํธํฅ๋ ์๊ฒฌ์ผ ์ ์์ง๋ง, ์ฐฌ์ฑํฉ๋๋คโ๋ผ๊ณ
ํ์
จ๊ณ , RKG ๋์ โ์์ฐ!โ, MF ๋์ โ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํฉ๋๋คโ๋ผ๊ณ ํ์
จ์ต๋๋ค.
CDA
KM ๋๋ ์ฐฌ์ฑํ์
จ์ต๋๋ค. ์ ๋ ์ง์งํฉ๋๋ค. ํน์ ๋ โ๋ง์ธโ๋ โ์ผํธโ ๊ฐ์ ๋ฐ์์
์๋์? WH ๋๋ ์ฐฌ์ฑํ์
จ์ต๋๋ค. KM ๋, Tom ๋๋ ์ฐฌ์ฑํ์
จ์ต๋๋ค. ๋ค, ๊ฑฐ์ ๋ค ๋
๊ฒ ๊ฐ๋ค์. ๊ธฐ์ค์ ๋์์ต๋๋ค.
๊ฒฐ๋ก : Stage 4 ์น๊ฒฉ์ ์ถํํฉ๋๋ค.
์ด๋ป๊ฒ ๊ตฌํ ๋์์๊น?
๋ฏธํ
๋
ธํธ๋ฅผ ์ญ ๋ฐ๋ผ์ค๋ฉด์ ์ ์์ด ๋ฐ์๋๊ณ ์ต์ข
์น์ธ๋๊ธฐ ๊น์ง ๊ณผ์ ์ ์ดํด๋ณด์๋ค.
๊ทธ๋ ๋ค๋ฉด ์ค์ ๊ตฌํ์ ์ด๋ป๊ฒ ์ด๋ค์ ธ์์๊น?
๋จผ์ ์คํ์ ์ดํด๋ณด์.
Promise.try No description available
https://tc39.es/proposal-promise-try/#sec-promise.try
Promise.try ( callbackfn, โฆargs )
Let C be the this value.
If C is not an Object, throw a TypeError exception.
Let promiseCapability be ? NewPromiseCapability(C).
Let status be Completion(Call(callbackfn, undefined, args)).
If status is an abrupt completion, then
a. Perform ? Call(promiseCapability.[[Reject]], undefined, ยซ status.[[Value]] ยป).
Else,
a. Perform ? Call(promiseCapability.[[Resolve]], undefined, ยซ status.[[Value]] ยป).
Return promiseCapability.[[Promise]].
๋ฒ์ญํ๋ฉด ์๋์ ๊ฐ๋ค.
Promise.try ( callbackfn, โฆargs )
try ๋ฉ์๋๋ callbackfn ์ธ์๋ฅผ ๋ฐ์ ๋ค์ ์ ์ฐจ๋ฅผ ์ํํ๋ค:
C๋ฅผ this ๊ฐ์ผ๋ก ๋๋ค.
C๊ฐ ๊ฐ์ฒด(Object)๊ฐ ์๋๋ฉด TypeError ์์ธ๋ฅผ ๋์ง๋ค.
promiseCapability๋ฅผ ? NewPromiseCapability(C)๋ก ์ค์ ํ๋ค.
status๋ฅผ Completion(Call(callbackfn, undefined, args))๋ก ์ค์ ํ๋ค.
status๊ฐ abrupt completion(๋น์ ์ ์๋ฃ)๋ผ๋ฉด
a. ? Call(promiseCapability.[[Reject]], undefined, ยซ status.[[Value]] ยป)๋ฅผ ์ํํ๋ค.
๊ทธ๋ ์ง ์๋ค๋ฉด
a. ? Call(promiseCapability.[[Resolve]], undefined, ยซ status.[[Value]] ยป)๋ฅผ ์ํํ๋ค.
promiseCapability.[[Promise]]๋ฅผ ๋ฐํํ๋ค.
์คํฉ์ ์์ฌ์ฝ๋ ์ฝ๋ ๋ฒ์ ์๋์ ๋ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํด๋ณด์
ECMAScriptยฎ 2026 Languageย Specification No description available
https://tc39.es/ecma262/multipage/notational-conventions.html#sec-algorithm-conventions
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์ ๋ฐํ๋ฅผ ์ดํด๋ณด๋ฉด ์ ๋์์๋ค.
VIDEO
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์ ์ธ๋ชจ๋ฅผ ์ฐพ์๋ณด๋ค๊ฐ ์ด๊ฒ ์ ๊ฒ ๋ง์ ๊ฒ๋ค์ ์ดํผ๋ณด์๋ค.
์ ์๊ณผ์ ์ ์ดํด๋ณผ๋ ์ฌ๋ฌ๋ฒ์ ์๋ฌธ์ ๊ธฐ๋ฅผ ๋ง๋ ๊ฒ์ ๋ณด๋ฉฐ, ๊ด์๋ฆฌ ๋ด๊ฐ ๋ ์จ์ด ๋งํ์๋ค.
์ด๋ค์์ผ๋ก ์ฌ๋ฌ ๋ฉ์๋๋ค์ด ์ฐ๋ฆฌ์๊ฒ ๋์ฐฉํ๊ฒ ๋๋์ง ๊ถ๊ธํ ์ด์๊ฒ ๋์์ด ๋์๊ธธ ๋ฐ๋๋ค.
์ฐธ๊ณ ๋ฌธํ
Promise.try - MDN Web Docs
Promise.try() support now enabled in Chrome (web.dev)
TC39 Proposal - Promise.try specification
Original TC39 Promise.try Proposal README
Bluebird - Promise.try documentation
What is Promise.try, and why does it matter? (Joepie91โs blog)
GitHub - TC39 Promise.try issue discussion
V8 Torque documentation
V8 Torque Builtins documentation
V8 CodeStubAssembler blog post
Chromium Source - Promise.try implementation in Torque
V8 Torque Compiler source code
Jfokus 2020 - V8 Torque: A Typed Language to Implement JavaScript (slides)
Tobias Tebbi - V8 Torque: A Typed Language to Implement JavaScript (YouTube)