Promise.withResolvers()
Baseline
2024
Newly available
Since โจMarch 2024โฉ, this feature works across the latest devices and browser versions. This feature might not work in older devices or browsers.
Promise.withResolvers()
์ ์ ๋ฉ์๋๋ ์๋ก์ด Promise
๊ฐ์ฒด์, ๊ทธ ๊ฐ์ฒด๋ฅผ ์ดํํ๊ฑฐ๋ ๊ฑฐ๋ถํ ์ ์๋ ๋ ํจ์๋ฅผ ํฌํจํ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค. ์ด ๋ ํจ์๋ค์ Promise()
์์ฑ์์ ์คํ์ ํจ์์ ์ ๋ฌ๋๋ ๋งค๊ฐ๋ณ์์ ํด๋นํฉ๋๋ค.
๊ตฌ๋ฌธ
Promise.withResolvers()
๋งค๊ฐ๋ณ์
์์.
๋ฐํ ๊ฐ
๋ค์ ์์ฑ์ ํฌํจํ๋ ์ผ๋ฐ ๊ฐ์ฒด.
promise
-
Promise
๊ฐ์ฒด. resolve
-
promise๋ฅผ ์ดํํ๋ ํจ์์ ๋๋ค. ์ด ํจ์์ ์๋ฏธ์ ๋ํด์๋
Promise()
์์ฑ์ ์ฐธ๊ณ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์. reject
-
promise๋ฅผ ๊ฑฐ๋ถํ๋ ํจ์์ ๋๋ค. ์ด ํจ์์ ์๋ฏธ์ ๋ํด์๋
Promise()
์์ฑ์ ์ฐธ๊ณ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์.
์ค๋ช
Promise.withResolvers()
๋ ๋ค์ ์ฝ๋์ ๋์ผํฉ๋๋ค.
let resolve, reject;
const promise = new Promise((res, rej) => {
resolve = res;
reject = rej;
});
ํด๋น ๋ฉ์๋๋ ๋ ๊ฐ๊ฒฐํ๋ฉฐ let
์ ์ฌ์ฉํ ํ์๊ฐ ์์ต๋๋ค.
Promise.withResolvers()
๋ฅผ ์ฌ์ฉํ ๋์ ์ฃผ์ ์ฐจ์ด์ ์ ์ดํ ๋ฐ ๊ฑฐ๋ถ ํจ์๊ฐ ์ด์ promise ์์ฒด์ ๋์ผํ ์ค์ฝํ์ ์์นํ๋ค๋ ์ ์
๋๋ค. ์ด๋ ์คํ์ ๋ด๋ถ์์ ํ ๋ฒ๋ง ์์ฑ๋๊ณ ์ฌ์ฉ๋๋ ๊ฒ๊ณผ๋ ๋ค๋ฆ
๋๋ค. ์ด๋ฌํ ๊ตฌ์กฐ๋ ํนํ ์คํธ๋ฆผ๊ณผ ํ์์ ๋ฐ๋ณต ์ด๋ฒคํธ๋ฅผ ๋ค๋ฃฐ ๋ ํด๋น ํจ์๋ค์ ์ฌ์ฌ์ฉํ ์ ์๋ ๊ณ ๊ธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ๋ํ ๋ง์ ๋ก์ง์ ์คํ์ ๋ด๋ถ์ ๊ฐ์ธ๋ ๊ฒ๋ณด๋ค ์ค์ฒฉ์ด ์ค์ด๋๋ ๊ฒฝํฅ์ด ์์ต๋๋ค.
Promise.withResolvers()
๋ ์ ๋ค๋ฆญ ๋ฉ์๋์ด๋ฉฐ ์๋ธํด๋์ฑ์ ์ง์ํฉ๋๋ค. ์ฆ, Promise
์ ์๋ธํด๋์ค์์๋ ํธ์ถํ ์ ์๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ ํด๋น ์๋ธํด๋์ค ํ์
์ promise๋ฅผ ํฌํจํฉ๋๋ค. ์ด๋ฅผ ์ํด ์๋ธํด๋์ค์ ์์ฑ์๋ Promise()
์์ฑ์์ ๋์ผํ ์๊ทธ๋์ฒ๋ฅผ ๊ตฌํํด์ผ ํ๋ฉฐ, ์ฆ resolve
์ reject
์ฝ๋ฐฑ์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ ์ ์๋ ๋จ์ผ executor
ํจ์๋ฅผ ๋ฐ์์ผ ํฉ๋๋ค.
์์
์คํธ๋ฆผ์ ๋น๋๊ธฐ ์ดํฐ๋ฌ๋ธ๋ก ๋ณํํ๊ธฐ
Promise.withResolvers()
์ ์ฌ์ฉ ์ฌ๋ก๋ ์ด๋ค ์ด๋ฒคํธ ๋ฆฌ์ค๋์ ์ํด ์ดํ๋๊ฑฐ๋ ๊ฑฐ๋ถ๋์ด์ผ ํ๋ promise๊ฐ ์์ ๋์
๋๋ค. ์ด ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ promise ์คํ์ ๋ด๋ถ์ ๊ฐ์ ์ ์์ต๋๋ค. ๋ค์ ์์ ๋ Node.js์ ์ฝ๊ธฐ ๊ฐ๋ฅํ ์คํธ๋ฆผ์ ๋น๋๊ธฐ ์ดํฐ๋ฌ๋ธ๋ก ๋ณํํ๋ ๊ณผ์ ์ ๋ณด์ฌ์ค๋๋ค. ์ฌ๊ธฐ์ ๊ฐ promise
๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๋จ์ผ ๋ฐ์ดํฐ ๋ฐฐ์น๋ฅผ ๋ํ๋ด๋ฉฐ, ํ์ฌ ๋ฐฐ์น๊ฐ ์ฝํ ๋๋ง๋ค ๋ค์ ๋ฐฐ์น๋ฅผ ์ํ ์๋ก์ด promise๊ฐ ์์ฑ๋ฉ๋๋ค. ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ ํ ๋ฒ๋ง ์ฐ๊ฒฐ๋์ง๋ง, ๋งค๋ฒ ๋ค๋ฅธ ๋ฒ์ ์ resolve
๋ฐ reject
ํจ์๋ฅผ ํธ์ถํ๋ค๋ ์ ์ ์ฃผ๋ชฉํ์ธ์.
async function* readableToAsyncIterable(stream) {
let { promise, resolve, reject } = Promise.withResolvers();
stream.on("error", (error) => reject(error));
stream.on("end", () => resolve());
stream.on("readable", () => resolve());
while (stream.readable) {
await promise;
let chunk;
while ((chunk = stream.read())) {
yield chunk;
}
({ promise, resolve, reject } = Promise.withResolvers());
}
}
ํ๋ผ๋ฏธ์ค๊ฐ ์๋ ์์ฑ์์์ withResolvers() ํธ์ถํ๊ธฐ
Promise.withResolvers()
๋ ์ ๋ค๋ฆญ ๋ฉ์๋์
๋๋ค. ์ด ๋ฉ์๋๋ Promise()
์์ฑ์์ ๋์ผํ ์๊ทธ๋์ฒ๋ฅผ ๊ตฌํํ ์์ฑ์์์ ํธ์ถํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, executor
์ resolve
์ reject
ํจ์๋ก console.log
๋ฅผ ์ ๋ฌํ๋ ์์ฑ์์์๋ ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
class NotPromise {
constructor(executor) {
// "resolve"์ "reject" ํจ์๋ ๋ค์ดํฐ๋ธ ํ๋ก๋ฏธ์ค์ ๊ฒ๊ณผ ์ ํ ๋ค๋ฅด๊ฒ ๋์ํ์ง๋ง,
// Promise.withResolvers()๋ ๊ทธ๋ฅ ์ด ํจ์๋ค์ ๋ฐํํฉ๋๋ค.
executor(
(value) => console.log("Resolved", value),
(reason) => console.log("Rejected", reason),
);
}
}
const { promise, resolve, reject } = Promise.withResolvers.call(NotPromise);
resolve("hello");
// ๋ก๊ทธ ์ถ๋ ฅ: Resolved hello
๋ช ์ธ์
Specification |
---|
ECMAScriptยฎ 2026 Language Specification # sec-promise.withResolvers |
๋ธ๋ผ์ฐ์ ํธํ์ฑ
Loadingโฆ