This page was translated from English by the community. Learn more and join the MDN Web Docs community.

View in English Always switch to English

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() ์ƒ์„ฑ์ž์˜ ์‹คํ–‰์ž ํ•จ์ˆ˜์— ์ „๋‹ฌ๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ๋ฌธ

js
Promise.withResolvers()

๋งค๊ฐœ๋ณ€์ˆ˜

์—†์Œ.

๋ฐ˜ํ™˜ ๊ฐ’

๋‹ค์Œ ์†์„ฑ์„ ํฌํ•จํ•˜๋Š” ์ผ๋ฐ˜ ๊ฐ์ฒด.

promise

Promise ๊ฐ์ฒด.

resolve

promise๋ฅผ ์ดํ–‰ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜์˜ ์˜๋ฏธ์— ๋Œ€ํ•ด์„œ๋Š” Promise() ์ƒ์„ฑ์ž ์ฐธ๊ณ  ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

reject

promise๋ฅผ ๊ฑฐ๋ถ€ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜์˜ ์˜๋ฏธ์— ๋Œ€ํ•ด์„œ๋Š” Promise() ์ƒ์„ฑ์ž ์ฐธ๊ณ  ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์„ค๋ช…

Promise.withResolvers()๋Š” ๋‹ค์Œ ์ฝ”๋“œ์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

js
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 ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๋Š” ์ ์— ์ฃผ๋ชฉํ•˜์„ธ์š”.

js
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๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์ƒ์„ฑ์ž์—์„œ๋„ ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
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

๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ

๊ฐ™์ด ๋ณด๊ธฐ