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

Using promises

page(Doc) not found /ko/docs/Web/JavaScript/Guide/Details_of_the_Object_Model

Promise๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์˜ ์ตœ์ข… ์™„๋ฃŒ ๋˜๋Š” ์‹คํŒจ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„ ์—ฌ๋Ÿฌ๋ถ„์€ ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ promise๋ฅผ ์‚ฌ์šฉํ–ˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” ์–ด๋–ป๊ฒŒ promise๋ฅผ ๋งŒ๋“œ๋Š”์ง€ ์„ค๋ช…ํ•˜๊ธฐ์— ์•ž์„œ promise์˜ ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ promise๋Š” ํ•จ์ˆ˜์— ์ฝœ๋ฐฑ์„ ์ „๋‹ฌํ•˜๋Š” ๋Œ€์‹ ์—, ์ฝœ๋ฐฑ์„ ์ฒจ๋ถ€ํ•˜๋Š” ๋ฐฉ์‹์˜ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

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

createAudioFileAsync()๋Š” ํ•จ์ˆ˜๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

js
function successCallback(result) {
  console.log("Audio file ready at URL: " + result);
}

function failureCallback(error) {
  console.log("Error generating audio file: " + error);
}

createAudioFileAsync(audioSettings, successCallback, failureCallback);

โ€ฆ๋ชจ๋˜ํ•œ ํ•จ์ˆ˜๋“ค์€ ์œ„์™€ ๊ฐ™์ด ์ฝœ๋ฐฑ๋“ค์„ ์ „๋‹ฌํ•˜์ง€ ์•Š๊ณ  ์ฝœ๋ฐฑ์„ ๋ถ™์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ค๋‹ˆ๋‹ค.

๋งŒ์•ฝ createAudioFileAsync() ํ•จ์ˆ˜๊ฐ€ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ˆ˜์ •ํ•œ๋‹ค๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
createAudioFileAsync(audioSettings).then(successCallback, failureCallback);

โ€ฆ์กฐ๊ธˆ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ์จ๋ณด์ž๋ฉด:

js
const promise = createAudioFileAsync(audioSettings);
promise.then(successCallback, failureCallback);

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

Guarantees

์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•ด์ฃผ๋Š” ๊ณ ์ „์ ์ธ ๋ฐฉ์‹๊ณผ๋Š” ๋‹ฌ๋ฆฌ, Promise๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ํŠน์ง•์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

  • ์ฝœ๋ฐฑ์€ JavaScript Event Loop๊ฐ€ ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ์ฝœ ์Šคํƒ์„ ์™„๋ฃŒํ•˜๊ธฐ ์ด์ „์—๋Š” ์ ˆ๋Œ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋น„๋™๊ธฐ ์ž‘์—…์ด ์„ฑ๊ณตํ•˜๊ฑฐ๋‚˜ ์‹คํŒจํ•œ ๋’ค์— then() ์„ ์ด์šฉํ•˜์—ฌ ์ถ”๊ฐ€ํ•œ ์ฝœ๋ฐฑ์˜ ๊ฒฝ์šฐ์—๋„ ์œ„์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • then()์„ ์—ฌ๋Ÿฌ๋ฒˆ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ฝœ๋ฐฑ์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ๊ฐ์˜ ์ฝœ๋ฐฑ์€ ์ฃผ์–ด์ง„ ์ˆœ์„œ๋Œ€๋กœ ํ•˜๋‚˜ ํ•˜๋‚˜ ์‹คํ–‰๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Promise์˜ ๊ฐ€์žฅ ๋›ฐ์–ด๋‚œ ์žฅ์  ์ค‘์˜ ํ•˜๋‚˜๋Š” chaining์ž…๋‹ˆ๋‹ค.

Chaining

๋ณดํ†ต ๋‘ ๊ฐœ ์ด์ƒ์˜ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์„ ํ”ํžˆ ๋ณด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ˆœ์ฐจ์ ์œผ๋กœ ๊ฐ๊ฐ์˜ ์ž‘์—…์ด ์ด์ „ ๋‹จ๊ณ„ ๋น„๋™๊ธฐ ์ž‘์—…์ด ์„ฑ๊ณตํ•˜๊ณ  ๋‚˜์„œ ๊ทธ ๊ฒฐ๊ณผ๊ฐ’์„ ์ด์šฉํ•˜์—ฌ ๋‹ค์Œ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ promise chain์„ ์ด์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

then() ํ•จ์ˆ˜๋Š” ์ƒˆ๋กœ์šด promise๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ์— ๋งŒ๋“ค์—ˆ๋˜ promise์™€๋Š” ๋‹ค๋ฅธ ์ƒˆ๋กœ์šด promise์ž…๋‹ˆ๋‹ค.

js
const promise = doSomething();
const promise2 = promise.then(successCallback, failureCallback);

๋˜๋Š”

js
const promise2 = doSomething().then(successCallback, failureCallback);

๋‘ ๋ฒˆ์งธ promise๋Š” doSomething() ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ successCallback or failureCallback ์˜ ์™„๋ฃŒ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. successCallback or failureCallback ๋˜ํ•œ promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ promise2์— ์ถ”๊ฐ€๋œ ์ฝœ๋ฐฑ์€ successCallback๋˜๋Š” failureCallback์— ์˜ํ•ด ๋ฐ˜ํ™˜๋œ promise ๋’ค์— ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ, ๊ฐ๊ฐ์˜ promise๋Š” ์ฒด์ธ ์•ˆ์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ๋น„๋™๊ธฐ ๋‹จ๊ณ„์˜ ์™„๋ฃŒ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์˜ˆ์ „์—๋Š” ์—ฌ๋Ÿฌ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์—ฐ์†์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋ฉด ๊ณ ์ „์ ์ธ '์ง€์˜ฅ์˜ ์ฝœ๋ฐฑ ํ”ผ๋ผ๋ฏธ๋“œ'๊ฐ€ ๋งŒ๋“ค์–ด ์กŒ์—ˆ์Šต๋‹ˆ๋‹ค.

js
doSomething(function (result) {
  doSomethingElse(
    result,
    function (newResult) {
      doThirdThing(
        newResult,
        function (finalResult) {
          console.log("Got the final result: " + finalResult);
        },
        failureCallback,
      );
    },
    failureCallback,
  );
}, failureCallback);

๋ชจ๋˜ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ•œ๋‹ค๋ฉด, ์šฐ๋ฆฌ๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋“ค์„ ๋ฐ˜ํ™˜๋œ promise์— promise chain์„ ํ˜•์„ฑํ•˜๋„๋ก ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

js
doSomething()
  .then(function (result) {
    return doSomethingElse(result);
  })
  .then(function (newResult) {
    return doThirdThing(newResult);
  })
  .then(function (finalResult) {
    console.log("Got the final result: " + finalResult);
  })
  .catch(failureCallback);

then ์— ๋„˜๊ฒจ์ง€๋Š” ์ธ์ž๋Š” ์„ ํƒ์ (optional)์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  catch(failureCallback) ๋Š” then(null, failureCallback) ์˜ ์ถ•์•ฝ์ž…๋‹ˆ๋‹ค. ์ด ํ‘œํ˜„์‹์„ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

js
doSomething()
  .then((result) => doSomethingElse(result))
  .then((newResult) => doThirdThing(newResult))
  .then((finalResult) => {
    console.log(`Got the final result: ${finalResult}`);
  })
  .catch(failureCallback);

์ค‘์š”: ๋ฐ˜ํ™˜๊ฐ’์ด ๋ฐ˜๋“œ์‹œ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค, ๋งŒ์•ฝ ์—†๋‹ค๋ฉด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์ด์ „์˜ promise์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. (ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ () => x๋Š” () => {return x;}์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.)

Chaining after a catch

chain์—์„œ ์ž‘์—…์ด ์‹คํŒจํ•œ ํ›„์—๋„ ์ƒˆ๋กœ์šด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. (์˜ˆ : catch) ๋‹ค์Œ ์˜ˆ๋ฅผ ์ฝ์œผ์‹ญ์‹œ์˜ค:

js
new Promise((resolve, reject) => {
  console.log("Initial");

  resolve();
})
  .then(() => {
    throw new Error("Something failed");

    console.log("Do this");
  })
  .catch(() => {
    console.log("Do that");
  })
  .then(() => {
    console.log("Do this, whatever happened before");
  });

๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ ํ…์ŠคํŠธ๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

    Initial
    Do that
    Do this, whatever happened before

์ฐธ๊ณ  : "Do this" ํ…์ŠคํŠธ๊ฐ€ ์ถœ๋ ฅ๋˜์ง€ ์•Š์€ ๊ฒƒ์„ ์ฃผ์˜๊นŠ๊ฒŒ ๋ณด์‹ญ์‹œ์˜ค. "Something failed" ์—๋Ÿฌ๊ฐ€ rejection์„ ๋ฐœ์ƒ์‹œ์ผฐ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

Error propagation

'์ฝœ๋ฐฑ ์ง€์˜ฅ'์—์„œ failureCallback์ด 3๋ฒˆ ๋ฐœ์ƒํ•œ ๊ฒƒ์„ ๊ธฐ์–ตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. promise chain์—์„œ๋Š” ๋‹จ ํ•œ ๋ฒˆ๋งŒ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„๊ต๋˜์ฃ .

js
doSomething()
  .then((result) => doSomethingElse(result))
  .then((newResult) => doThirdThing(newResult))
  .then((finalResult) => console.log(`Got the final result: ${finalResult}`))
  .catch(failureCallback);

๊ธฐ๋ณธ์ ์œผ๋กœ promise chain์€ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ฉˆ์ถ”๊ณ  chain์˜ ์•„๋ž˜์—์„œ catch๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋™๊ธฐ ์ฝ”๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ๋ชจ๋ธ๋ง ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

js
try {
  const result = syncDoSomething();
  const newResult = syncDoSomethingElse(result);
  const finalResult = syncDoThirdThing(newResult);
  console.log(`Got the final result: ${finalResult}`);
} catch (error) {
  failureCallback(error);
}

๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ์ด๋Ÿฌํ•œ ๋Œ€์นญ์„ฑ์€ ECMAScript 2017์—์„œ async/await ๊ตฌ๋ฌธ(Syntactic sugar) ์—์„œ ์ตœ๊ณ ๋กœ ๋А๋‚„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
async function foo() {
  try {
    const result = await doSomething();
    const newResult = await doSomethingElse(result);
    const finalResult = await doThirdThing(newResult);
    console.log(`Got the final result: ${finalResult}`);
  } catch (error) {
    failureCallback(error);
  }
}

์ด๊ฒƒ์€ promise๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. doSomething()์€ ์ด์ „ ํ•จ์ˆ˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฌธ๋ฒ•์€ ์ด๊ณณ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

Promise rejection events

Promise๊ฐ€ reject๋  ๋•Œ๋งˆ๋‹ค ๋‘ ๊ฐ€์ง€ ์ด๋ฒคํŠธ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ „์—ญ ๋ฒ”์œ„์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.(์ผ๋ฐ˜์ ์œผ๋กœ, ์ „์—ญ ๋ฒ”์œ„๋Š” window๊ฑฐ๋‚˜, ์›น ์›Œ์ปค์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ, Worker, ํ˜น์€ ์›Œ์ปค ๊ธฐ๋ฐ˜ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.) ๋‘ ๊ฐ€์ง€ ์ด๋ฒคํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

rejectionhandled

executor์˜ rejectํ•จ์ˆ˜์— ์˜ํ•ด reject๊ฐ€ ์ฒ˜๋ฆฌ ๋œ ํ›„ promise๊ฐ€ reject ๋  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

unhandledrejection

promise๊ฐ€ reject๋˜์—ˆ์ง€๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” reject ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์—†์„ ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

(PromiseRejectionEvent ์œ ํ˜•์ธ) ๋‘ ์ด๋ฒคํŠธ์—๋Š” ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์ธ promise์™€ reason ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. promise๋Š” reject๋œ promise๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์†์„ฑ์ด๊ณ , reason์€ promise๊ฐ€ reject๋œ ์ด์œ ๋ฅผ ์•Œ๋ ค ์ฃผ๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค.

์ด๋“ค์„ ์ด์šฉํ•ด ํ”„๋กœ๋ฏธ์Šค์— ๋Œ€ํ•œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ๋Œ€์ฒด(fallback)ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์ง€๋ฉฐ, ๋˜ํ•œ ํ”„๋กœ๋ฏธ์Šค ๊ด€๋ฆฌ์‹œ ๋ฐœ์ƒํ•˜๋Š” ์ด์Šˆ๋“ค์„ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•ธ๋“ค๋Ÿฌ๋“ค์€ ๋ชจ๋“  ๋งฅ๋ฝ์—์„œ ์ „์—ญ์ (global)์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋ชจ๋“  ์—๋Ÿฌ๋Š” ๋ฐœ์ƒํ•œ ์ง€์ (source)์— ์ƒ๊ด€์—†์ด ๋™์ผํ•œ ํ•ธ๋“ค๋Ÿฌ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

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

js
window.addEventListener(
  "unhandledrejection",
  (event) => {
    /* You might start here by adding code to examine the
     promise specified by event.promise and the reason in
     event.reason */

    event.preventDefault();
  },
  false,
);

์ด๋ฒคํŠธ์˜ preventDefault() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด reject ๋œ ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์•˜์„ ๋•Œ JavaScript ๋Ÿฐํƒ€์ž„์ด ๊ธฐ๋ณธ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋ณธ ๋™์ž‘์€ ๋Œ€๊ฐœ ์ฝ˜์†”์— ์˜ค๋ฅ˜๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ด๊ฒƒ์€ ํ™•์‹คํžˆ NodeJS๋ฅผ ์œ„ํ•œ ๊ฒƒ์ด์ฃ .

์ œ๋Œ€๋กœ ํ•˜๋ ค๋ฉด, ๋‹น์—ฐํ•œ ๋ง์ด์ง€๋งŒ, ์ด ์ด๋ฒคํŠธ๋ฅผ ๊ทธ๋ƒฅ ๋ฌด์‹œํ•ด๋ฒ„๋ฆฌ๊ธฐ ์ „์— reject๋œ ํ”„๋กœ๋ฏธ์Šค ์ฝ”๋“œ์— ์‹ค์ œ๋กœ ๋ฒ„๊ทธ๊ฐ€ ์—†๋Š”์ง€ ํ™•์‹คํžˆ ๊ฒ€์‚ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋ž˜๋œ ์ฝœ๋ฐฑ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Promise๋งŒ๋“ค๊ธฐ

Promise๋Š” ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ƒ์„ฑ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์˜ค๋ž˜๋œ API๋ฅผ ๊ฐ์Œ€ ๋•Œ๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด์ƒ์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์„ธ๊ณ„์—์„œ๋Š” ๋ชจ๋“  ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋Š” promise์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜์ง€๋งŒ, ๋ถˆํ–‰ํžˆ๋„ ์ผ๋ถ€ API๋Š” ์—ฌ์ „ํžˆ success ๋ฐ / ๋˜๋Š” failure ์ฝœ๋ฐฑ์„ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์ผ๊ฑฐ๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด setTimeout () ํ•จ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

js
setTimeout(() => saySomething("10 seconds passed"), 10000);

์˜ˆ์ „ ์Šคํƒ€์ผ์˜ ์ฝœ๋ฐฑ๊ณผ Promise๋ฅผ ํ•ฉ์น˜๋Š” ๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜ saySomething()์ด ์‹คํŒจํ•˜๊ฑฐ๋‚˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์œผ๋ฉด ์•„๋ฌด ๊ฒƒ๋„ ์žก์•„ ๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. setTimeout์˜ ๋ฌธ์ œ์  ์ž…๋‹ˆ๋‹ค.

๋‹คํ–‰ํžˆ๋„ ์šฐ๋ฆฌ๋Š” setTimeout์„ Promise๋กœ ๊ฐ์Œ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ๋‚ฎ์€ ์ˆ˜์ค€์—์„œ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ํ•จ์ˆ˜๋ฅผ ๊ฐ์‹ผ ๋‹ค์Œ ๋‹ค์‹œ๋Š” ์ง์ ‘ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

js
const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));

wait(10000)
  .then(() => saySomething("10 seconds"))
  .catch(failureCallback);

๊ธฐ๋ณธ์ ์œผ๋กœ promise constructor๋Š” promise๋ฅผ ์ง์ ‘ ํ•ด๊ฒฐํ•˜๊ฑฐ๋‚˜ reject ํ•  ์ˆ˜ ์žˆ๋Š” ์‹คํ–‰์ž ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. setTimeout()์€ ํ•จ์ˆ˜์—์„œ fail์ด ์ผ์–ด๋‚˜๊ฑฐ๋‚˜ error๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ฒฝ์šฐ reject๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Composition

Promise.resolve ()์™€ Promise.reject ()๋Š” ๊ฐ๊ฐ ์ด๋ฏธ resolve๋˜๊ฑฐ๋‚˜ reject ๋œ promise๋ฅผ ์—ฌ๋Ÿฌ๋ถ„์ด ์ง์ ‘ ์ƒ์„ฑํ•˜๊ธฐ์œ„ํ•œ ๋ฐ”๋กœ ๊ฐ€๊ธฐ์ž…๋‹ˆ๋‹ค. ๊ฐ€๋” ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

Promise.all()์™€ Promise.race()๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์„ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•˜๊ธฐ์œ„ํ•œ ๋‘ ๊ฐ€์ง€ ๊ตฌ์„ฑ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋ณ‘๋ ฌ๋กœ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ชจ๋‘ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
Promise.all([func1(), func2(), func3()]).then(([result1, result2, result3]) => {
  /* use result1, result2 and result3 */
});

๊ณ ๊ธ‰์ง„ JavaScript๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆœ์ฐจ์  ๊ตฌ์„ฑ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

js
[func1, func2, func3]
  .reduce((p, f) => p.then(f), Promise.resolve())
  .then((result3) => {
    /* use result3 */
  });

๊ธฐ๋ณธ์ ์œผ๋กœ, ์šฐ๋ฆฌ๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ๋ฐฐ์—ด์„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ promise ์ฒด์ธ์œผ๋กœ ์ค„์ž…๋‹ˆ๋‹ค. Promise.resolve().then(func1).then(func2).then(func3);

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

js
const applyAsync = (acc, val) => acc.then(val);
const composeAsync =
  (...funcs) =>
  (x) =>
    funcs.reduce(applyAsync, Promise.resolve(x));

composeAsync() ํ•จ์ˆ˜๋Š” ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ๋ฐ›์•„๋“ค์ด๊ณ  composition ํŒŒ์ดํ”„ ๋ผ์ธ์„ ํ†ตํ•ด ์ „๋‹ฌ๋˜๋Š” ์ดˆ๊ธฐ ๊ฐ’์„ ํ—ˆ์šฉํ•˜๋Š” ์ƒˆ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

js
const transformData = composeAsync(func1, func2, func3);
const result3 = transformData(data);

ECMAScript 2017์—์„œ๋Š” async / await๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆœ์ฐจ์  ๊ตฌ์„ฑ์„ ๋ณด๋‹ค ๊ฐ„๋‹จํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
let result;
for (const f of [func1, func2, func3]) {
  result = await f(result);
}
/* use last result (i.e. result3) */

Timing

๋†€๋ผ์›€(์—ญ์ž ์ฃผ. ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค๊ฑฐ๋‚˜, ์ฝ”๋“œ๊ฐ€ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค๊ฑฐ๋‚˜..ํ–ˆ์„๋•Œ์˜ ๊ทธ ๋†€๋ผ์›€..)์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด then()์— ์ „๋‹ฌ๋œ ํ•จ์ˆ˜๋Š” already-resolved promise์— ์žˆ๋Š” ๊ฒฝ์šฐ์—๋„ ๋™๊ธฐ์ ์œผ๋กœ ํ˜ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

js
Promise.resolve().then(() => console.log(2));
console.log(1); // 1, 2

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

js
const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));

wait().then(() => console.log(4));
Promise.resolve()
  .then(() => console.log(2))
  .then(() => console.log(3));
console.log(1); // 1, 2, 3, 4

Nesting

๊ฐ„๋‹จํ•œ promise ์ฒด์ธ์€ ํ‰ํ‰ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. ์ค‘์ฒฉ๋œ ์ฒด์ธ์€ ๋ถ€์ฃผ์˜ํ•œ ๊ตฌ์„ฑ์˜ ๊ฒฐ๊ณผ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. common mistakes๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์ค‘์ฒฉ์€ catch ๋ฌธ ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•˜๋Š” ์ œ์–ด ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ, ์ค‘์ฒฉ๋œ catch๋Š” ์ค‘์ฒฉ๋œ ๋ฒ”์œ„ ์™ธ๋ถ€์˜ ์ฒด์ธ์— ์žˆ๋Š” ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹Œ ๋ฒ”์œ„ ๋ฐ ๊ทธ ์ดํ•˜์˜ ์˜ค๋ฅ˜๋งŒ ์žก์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์˜ค๋ฅ˜ ๋ณต๊ตฌ ์‹œ ๋” ์ •ํ™•ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

js
doSomethingCritical()
  .then((result) =>
    doSomethingOptional(result)
      .then((optionalResult) => doSomethingExtraNice(optionalResult))
      .catch((e) => {}),
  ) // Ignore if optional stuff fails; proceed.
  .then(() => moreCriticalStuff())
  .catch((e) => console.log("Critical failure: " + e.message));

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

inner neutralizing catch ๋ฌธ์€ doSomethingOptional()๋ฐ doSomethingExtraNice()์—์„œ ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜๋ฅผ catch ํ•œ ํ›„์— ์ฝ”๋“œ๊ฐ€ moreCriticalStuff()๋กœ ๋‹ค์‹œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ๊ฒƒ์€ doSomethingCritical()์ด ์‹คํŒจํ•˜๋ฉด ํ•ด๋‹น ์˜ค๋ฅ˜๋Š” ์ตœ์ข… (์™ธ๋ถ€) catch์—์„œ๋งŒ ํฌ์ฐฉ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Common mistakes

promise chains์„ ์ž‘์„ฑํ•  ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ์ผ๋ฐ˜์ ์ธ ์‹ค์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์‹ค์ˆ˜ ์ค‘ ๋ช‡ ๊ฐ€์ง€๋Š” ๋‹ค์Œ ์˜ˆ์ œ์—์„œ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

js
// Bad example! Spot 3 mistakes!

doSomething()
  .then(function (result) {
    doSomethingElse(result) // Forgot to return promise from inner chain + unnecessary nesting
      .then((newResult) => doThirdThing(newResult));
  })
  .then(() => doFourthThing());
// Forgot to terminate chain with a catch!

์ฒซ ๋ฒˆ์งธ ์‹ค์ˆ˜๋Š” ์ œ๋Œ€๋กœ ์ฒด์ธ์„ ์—ฐ๊ฒฐํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์ƒˆ๋กœ์šด promise๋ฅผ ๋งŒ๋“ค์—ˆ์ง€๋งŒ ๊ทธ๊ฒƒ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์—ˆ์„ ๋•Œ ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ฒด์ธ์ด ๋Š์–ด์ง€๊ฑฐ๋‚˜ ์˜คํžˆ๋ ค ๋‘ ๊ฐœ์˜ ๋…๋ฆฝ์ ์ธ ์ฒด์ธ์ด ๊ฒฝ์Ÿํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, doFourthThing()์€ doSomethingElse() ๋˜๋Š” doThirdThing()์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์˜๋„ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ์ด๋“ค๊ณผ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ณ„๋„์˜ ์ฒด์ธ์€ ๋ณ„๋„์˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์„œ ์žก๊ธฐ ์–ด๋ ค์šด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์‹ค์ˆ˜๋Š” ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ค‘์ฒฉ๋˜์–ด ์ฒซ ๋ฒˆ์งธ ์‹ค์ˆ˜๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์ค‘์ฒฉ์€ ๋‚ด๋ถ€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ธฐ์˜ ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•˜๋ฉฐ, ์˜๋„ํ•˜์ง€ ์•Š์€ ์—๋Ÿฌ๊ฐ€ ์บ์น˜๋˜์ง€ ์•Š๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ณ€ํ˜•์€ promise constructor anti-pattern์ž…๋‹ˆ๋‹ค. ์ด ํŒจํ„ด์€ ์ด๋ฏธ ์•ฝ์†์„ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๊ฐ์‹ธ๊ธฐ ์œ„ํ•ด promise ์ƒ์„ฑ์ž์˜ ์ค‘๋ณต ์‚ฌ์šฉ๊ณผ ์ค‘์ฒฉ์„ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค.

์„ธ ๋ฒˆ์งธ ์‹ค์ˆ˜๋Š” catch๋กœ ์ฒด์ธ์„ ์ข…๋ฃŒํ•˜๋Š” ๊ฒƒ์„ ์žŠ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ข…๋ฃŒ๋˜์ง€ ์•Š์€ promise ์ฒด์ธ์€ ๋Œ€๋ถ€๋ถ„์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ•œ promise rejection์„ ์ดˆ๋ž˜ํ•ฉ๋‹ˆ๋‹ค.

์ข‹์€ ๊ฒฝํ—˜ ๋ฒ•์น™์€ ํ•ญ์ƒ promise ์ฒด์ธ์„ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ์ข…๊ฒฐํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ, ์ƒˆ๋กœ์šด promise๋ฅผ ์–ป์ž๋งˆ์ž ์ฆ‰์‹œ ๋ฐ˜ํ™˜ํ•˜์—ฌ ๋ณต์žก๋„๋ฅผ ๋‚ฎ์ถ”๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

js
doSomething()
  .then(function (result) {
    return doSomethingElse(result);
  })
  .then((newResult) => doThirdThing(newResult))
  .then(() => doFourthThing())
  .catch((error) => console.log(error));

() => x ์€ () => { return x; }์˜ ์ถ•์•ฝํ˜•์ž„์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

์ด์ œ ์šฐ๋ฆฌ๋Š” ์ ์ ˆํ•œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ๊ฒฐ์ •์„ฑ์žˆ๋Š” ๋‹จ์ผ ์ฒด์ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

async/await๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ๋ฒ•์˜ ๊ฐ€์žฅ ํ”ํ•œ ์‹ค์ˆ˜๋Š” awaitํ‚ค์›Œ๋“œ๋ฅผ ๋นผ๋จน๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

promise์™€ ์ž‘์—…์ด ์ถฉ๋Œํ•  ๋•Œ

์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋Š” ์ˆœ์„œ๋กœ ์‹คํ–‰๋˜๋Š” promise ๋ฐ ์ž‘์—…(์˜ˆ: ์ด๋ฒคํŠธ ๋˜๋Š” ์ฝœ๋ฐฑ)์ด ์žˆ๋Š” ์ƒํ™ฉ์— ์ง๋ฉดํ•˜๋ฉด ๋งˆ์ดํฌ๋กœ ํƒœ์Šคํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ฑฐ๋‚˜ promise๊ฐ€ ์กฐ๊ฑด๋ถ€๋กœ ์ƒ์„ฑ๋  ๋•Œ promise์˜ ๊ท ํ˜•์„ ๋งž์ถ”๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

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

See also

page(Doc) not found /ko/docs/Web/JavaScript/Guide/Details_of_the_Object_Model