youngdeok 2023. 5. 21. 20:00

์•ฝ์†ํ•ด์ค˜ …

promise์˜ ํ•„์š”์„ฑ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ํŒจํ„ด์œผ๋กœ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณค ํ•ฉ๋‹ˆ๋‹ค.

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

์ด๋Ÿฐ์‹์œผ๋กœ์š” ๋ณด๊ธฐ๋งŒํ•ด๋„ ์ฝ๊ณ  ์‹ถ์ง€ ์•Š์•„์ง€๊ฒŒ ๋งŒ๋“œ๋Š” ๋งˆ๋ฒ•์„ ๋ถ€๋ฆฐ๋‹ต๋‹ˆ๋‹ค.

๋˜ํ•œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ๋น„๋™๊ธฐ๋กœ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜๋‹ค๊ณ  ํ•ด๋„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์ฆ‰์‹œ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ์—๋„ ๋ถˆํŽธํ•จ์„ ์ฃผ์ฃ .

 

์ด๋Ÿฌํ•œ ํ”„๋กœ๋ฏธ์Šค์˜ ํ•œ๊ณ„์™€ ๋ถˆํŽธํ•จ์œผ๋กœ ์ธํ•ด

ES6์—์„œ๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋‹ค๋ฅธ ํŒจํ„ด์œผ๋กœ promise๋ฅผ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค.

promise๋ž€?

“A promise is an object that may produce a single value some time in the future”

 

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

promise ์ƒ์„ฑ

Promise ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ ๋ฐ›๋Š”๋ฐ,

์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” resolve์™€ reject ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ ๋ฐ›์Šต๋‹ˆ๋‹ค.

const promise = new Promise((resolve, reject) => {
	// promise ํ•จ์ˆ˜์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.
	if (/* ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์„ฑ๊ณต */) {
    resolve('result');
  } else /* ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์‹คํŒจ */ {
    reject('fail')
  }
})

์ด๋Ÿฐ ์‹์œผ๋กœ ์ƒ์„ฑ์„ ํ•ฉ๋‹ˆ๋‹ค,

ํ”„๋กœ๋ฏธ์Šค๋Š” ๋น„๋™๊ธฐ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ 3๊ฐ€์ง€ ์ƒํƒœ์ •๋ณด๋กœ ๊ฐ–์Šต๋‹ˆ๋‹ค.

 

์ƒ์„ฑ๋œ ์งํ›„์˜ ํ”„๋กœ๋ฏธ์Šค์˜ ์ƒํƒœ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ pending์ž…๋‹ˆ๋‹ค.

์ดํ›„ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์ˆ˜ํ–‰๋˜๋ฉด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

 

ํ”„๋กœ๋ฏธ์Šค์˜ ์ƒํƒœ๋Š” resolve or reject ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฒฐ์ • ๋ฉ๋‹ˆ๋‹ค.

fulfiled ๋˜๋Š” rejected๋œ ์ƒํƒœ๋ฅผ settled์ƒํƒœ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. settled์ƒํƒœ๋Š” ์‹คํŒจ ์„ฑ๊ณต์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์ˆ˜ํ–‰๋œ ์ƒํƒœ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ๋ฏธ์Šค์˜ ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ

์ž ์ด์ œ ๋ฐ›์•„์˜จ ๊ฐ’๋“ค์„ ์–ด๋–ค ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ค˜์•ผ ํ• ๊นŒ์š”?.

ํฌ๊ฒŒ ์ƒํƒœ๋Š” fulfiled์™€ reject์— ๋”ฐ๋ผ ์ฒ˜๋ฆฌ ๋ฉ๋‹ˆ๋‹ค.

promise.prototype.then

then์€ ๋‘๊ฐœ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ ๋ฐ›์Šต๋‹ˆ๋‹ค.

  • ์ฒซ๋ฒˆ์งธ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ํ”„๋กœ๋ฏธ์Šค๊ฐ€ fulfiled๋˜๋ฉด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ด๋–„ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ํ”„๋กœ๋ฏธ์Šค์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ ๋ฐ›์Šต๋‹ˆ๋‹ค.
  • ๋‘๋ฒˆ์งธ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ํ”„๋กœ๋ฏธ์Šค๊ฐ€ rejecte๋˜๋ฉด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ํ”„๋กœ๋ฏธ์Šค์˜ ์—๋Ÿฌ๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ ๋ฐ›์Šต๋‹ˆ๋‹ค
// fulfiled
new Promise(resolve => resolve('fulfiled'))
  .then(v => console.log(v), e => console.log(e));

//  rejected
new Promise((_, reject) => reject(new Error('rejected')))
  .then(v => console.log(v), e => console.log(e));

promise.prototype.catch

์ด๋ฒˆ์— ์†Œ๊ฐœํ•  ๋ฉ”์„œ๋“œ๋Š” ํ•œ๊ฐœ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค. catch ๋ฉ”์„œ๋“œ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” promise๊ฐ€ rejected์ƒํƒœ์ธ ๊ฒฝ์šฐ์—๋งŒ ํ˜ธ์ถœ ๋ฉ๋‹ˆ๋‹ค.

//  rejected
new Promise((_, reject) => reject(new Error('rejected')))
  .catch(e => console.log(e));

ํ•ด๊ฒฐ

์ž ๊ทธ๋ž˜์„œ ์ฒ˜์Œ์— ๋งํ•œ ๋ฌธ์ œ์ ์ค‘์— ๊ฐ€๋…์„ฑ์„ ํ•ด์น˜๋Š” ๋น„๋™๊ธฐ ์ฝ”๋“œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

๋‹ค์Œ์€ ํŒŒ์ผ์„ ์ฝ์–ด ํŠน์ • ‘ํ‚ค์›Œ๋“œ’๋ฅผ ์ฐพ๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

 

์ฐธ ์ง€์ €๋ถ„ํ•˜๊ฒŒ ์—ฎ์—ฌ์žˆ์ฃ ?

const fs = require('fs');

fs.readFile('file1.txt', 'utf8', (err, data1) => {
  if (err) {
    console.error(err);
  } else {
    fs.readFile('file2.txt', 'utf8', (err, data2) => {
      if (err) {
        console.error(err);
      } else {
        fs.readFile('file3.txt', 'utf8', (err, data3) => {
          if (err) {
            console.error(err);
          } else {
            if (data1.includes('keyword') && data2.includes('keyword') && data3.includes('keyword')) {
              console.log('Keyword found in all files');
            } else {
              console.log('Keyword not found in all files');
            }
          }
        });
      }
    });
  }
});
const fs = require('fs');

function readFilePromise(filename) {
  return new Promise((resolve, reject) => {
    fs.readFile(filename, 'utf8', (err, data) => {
      if (err) {
        reject(err);
      } else {
        resolve(data);
      }
    });
  });
}

readFilePromise('file1.txt')
  .then((data1) => {
    return readFilePromise('file2.txt')
      .then((data2) => {
        return [data1, data2];
      });
  })
  .then(([data1, data2]) => {
    return readFilePromise('file3.txt')
      .then((data3) => {
        return [data1, data2, data3];
      });
  })
  .then(([data1, data2, data3]) => {
    if (data1.includes('keyword') && data2.includes('keyword') && data3.includes('keyword')) {
      console.log('Keyword found in all files');
    } else {
      console.log('Keyword not found in all files');
    }
  })
  .catch((error) => {
    console.error(error);
  });

promise๋ฅผ ํ†ตํ•ด ๊ฐ€๋…์„ฑ์„ ๋†’์ธ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

์ƒ๋Œ€์ ์œผ๋กœ ์ฝ”๋“œ์˜ ๊ธธ์ด๋Š” ๋Š˜์–ด๋‚ฌ์œผ๋‚˜, ์ฝ๊ธฐ ํ›จ์”ฌ ์ˆ˜์›”ํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ๋ฒˆ์—” async์™€ await์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

https://joshua1988.github.io/web-development/javascript/promise-for-beginners/