[JS] Promise์™€ Async, Await ๐Ÿงน

TATAยท2023๋…„ 1์›” 17์ผ
0

JavaScript

๋ชฉ๋ก ๋ณด๊ธฐ
20/25

โœ”๏ธ Promise

Promise๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋น„๋™๊ธฐ๋กœ ์ž‘๋™ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.
(Callback Hell์„ ๋ฐฉ์ง€ํ•˜๋Š” ์—ญํ• ๋„ ์ˆ˜ํ–‰ํ•œ๋‹ค.)


๐Ÿงฝ new Promise

Promise๋Š” class์ด๊ธฐ ๋•Œ๋ฌธ์— new ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด Promise ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๋œ๋‹ค.

๋˜ํ•œ Promise๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›๋Š”๋ฐ,
์ด ์ฝœ๋ฐฑ ํ•จ์ˆ˜(executor)๋Š” resolve, reject ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค.

let promise = new Promise((resolve, reject) => {
	// 1. ์ •์ƒ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒฝ์šฐ
	// resolve์˜ ์ธ์ž์— ๊ฐ’์„ ์ „๋‹ฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
	resolve(value);

	// 2. ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ
	// reject์˜ ์ธ์ž์— ์—๋Ÿฌ๋ฉ”์„ธ์ง€๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
	reject(error);
});

๐Ÿงฝ then, catch, finally

resolve : ์—ฐ์‚ฐ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋จ ๐Ÿ‘‰ .then

reject : ์—ฐ์‚ฐ์ด ์‹คํŒจํ•จ ๐Ÿ‘‰ .catch

์ •์ƒ ์ฒ˜๋ฆฌ ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด ๋ฌด์กฐ๊ฑด ์‹คํ–‰ ๐Ÿ‘‰.finally

let promise = new Promise(function(resolve, reject) {
	resolve("์„ฑ๊ณต");
});

promise
  .then(value => {
	console.log(value);
	// "์„ฑ๊ณต"
  })
  .catch(error => {
	console.log(error);
  })
  .finally(() => {
	console.log("์„ฑ๊ณต์ด๋“  ์‹คํŒจ๋“  ์ž‘๋™!");
	// "์„ฑ๊ณต์ด๋“  ์‹คํŒจ๋“  ์ž‘๋™!"
  })

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ

const character = (name) => {
  return new Promise((resolve, reject) => {
    if (name === "tata") {
      resolve("tata ์บ๋ฆญํ„ฐ์ž…๋‹ˆ๋‹ค."); // ์„ฑ๊ณต
    } else {
      reject("tata ์บ๋ฆญํ„ฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค."); // ์‹คํŒจ
    }
  });
};

character("tata")
  .then((value) => {
    console.log(value);
    // tata ์บ๋ฆญํ„ฐ์ž…๋‹ˆ๋‹ค.
  })
  .catch((error) => {
    console.log(error);
  })
  .finally(() => {
    console.log("๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.");
    // ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
  });

๐Ÿงฝ Promise chaining

Promise chaining๊ฐ€ ํ•„์š”ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ง„ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค.

Promise chaining์ด ๊ฐ€๋Šฅํ•œ ์ด์œ ?
.then .catch .finally์˜ ๋ฉ”์„œ๋“œ๋“ค์€ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ

.then ์•ˆ์—์„œ ๋ฆฌํ„ดํ•œ ๊ฐ’์ด Promise๋ฉด Promise์˜ ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ result๋ฅผ ๋‹ค์Œ .then ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ๋ฐ›์•„์˜ค๊ณ , Promise๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๋ฆฌํ„ดํ•œ ๊ฐ’์„ .then ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

let promise = new Promise(function(resolve, reject) {
	resolve('์„ฑ๊ณต');
	// reject("์‹คํŒจ");
});

promise
  .then((value) => {
    console.log(value);
    return '์„ฑ๊ณต';
  })
  .then((value) => {
    console.log(value);
    return '์„ฑ๊ณต';
  })
  .then((value) => {
    console.log(value);
    return '์„ฑ๊ณต';
  })
  .catch((error) => {
    console.log(error);
    return '์‹คํŒจ';
  })
  .finally(() => {
    console.log('์„ฑ๊ณต์ด๋“  ์‹คํŒจ๋“  ์ž‘๋™!');
  });
// ์„ฑ๊ณต
// ์„ฑ๊ณต
// ์„ฑ๊ณต
// ์„ฑ๊ณต์ด๋“  ์‹คํŒจ๋“  ์ž‘๋™!

โฑ setTimeout์„ ์‚ฌ์šฉํ•œ ์˜ˆ์ œ

const printString = (string) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve();
      console.log(string);
    }, Math.floor(Math.random() * 100) + 1);
  });
};

const printAll = () => {
  printString('A')
    .then(() => {
      return printString('B');
    })
    .then(() => {
      return printString('C');
    });
};

printAll();
// A
// B
// C

๐Ÿงฝ Promise.all()

Promise.all()์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋น„๋™๊ธฐ ์ž‘์—…์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์„๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

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

Promise.all()์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„ ๋•Œ

const promiseOne = () => new Promise((resolve, reject) => setTimeout(() => resolve('1์ดˆ'), 1000));
const promiseTwo = () => new Promise((resolve, reject) => setTimeout(() => resolve('2์ดˆ'), 2000));
const promiseThree = () => new Promise((resolve, reject) => setTimeout(() => resolve('3์ดˆ'), 3000));

// ๊ธฐ์กด
const result = [];
promiseOne()
  .then(value => {
    result.push(value);
    return promiseTwo();
  })
  .then(value => {
    result.push(value);
    return promiseThree();
  })
  .then(value => {
    result.push(value);
   console.log(result);  
	 // ['1์ดˆ', '2์ดˆ', '3์ดˆ']
  })
// ์ด 6์ดˆ๊ฐ€ ๊ฑธ๋ ธ๋‹ค.

Promise.all()์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ

// promise.all
Promise.all([promiseOne(), promiseTwo(), promiseThree()])
  .then((value) => console.log(value))
  // ['1์ดˆ', '2์ดˆ', '3์ดˆ']
  .catch((err) => console.log(err));
// ์ด 3์ดˆ๊ฐ€ ๊ฑธ๋ ธ๋‹ค.

Promise.all์€ ์ธ์ž๋กœ ๋ฐ›๋Š” ๋ฐฐ์—ด์— ์žˆ๋Š” Promise ์ค‘
ํ•˜๋‚˜๋ผ๋„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋ฉด ๋‚˜๋จธ์ง€ Promise์˜ state์™€ ์ƒ๊ด€์—†์ด ์ฆ‰์‹œ ์ข…๋ฃŒ๋œ๋‹ค.

Promise.all([
	new Promise((resolve, reject) => setTimeout(() => reject(new Error('์—๋Ÿฌ1'))), 1000),
	new Promise((resolve, reject) => setTimeout(() => reject(new Error('์—๋Ÿฌ2'))), 2000),
	new Promise((resolve, reject) => setTimeout(() => reject(new Error('์—๋Ÿฌ3'))), 3000),
])
  .then((value) => console.log(value))
  .catch((err) => console.log(err));
	// Error: ์—๋Ÿฌ1

์ด๋ ‡๊ฒŒ Promise๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ ์ฝ”๋“œ์˜ ์ˆœ์„œ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์ง€๋งŒ,
Callback ํ•จ์ˆ˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์งˆ์ˆ˜๋ก ๋ณต์žกํ•ด์ง€๊ณ 
๊ฐ€๋…์„ฑ์ด ๋‚ฎ์•„์ง€๋Š” Promise Hell์ด ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.
์ด ๋‹จ์ ์„ ํ•ด๊ฒฐํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด Async / Await๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.


โœ”๏ธ Async / Await

JavaScript๋Š” ES8์—์„œ async / awaitํ‚ค์›Œ๋“œ๋ฅผ ์ œ๊ณตํ•˜์˜€๋‹ค.
์ด๋ฅผ ํ†ตํ•ด ๋ณต์žกํ•œ Promise ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿค” ์‚ฌ์šฉ๋ฒ•?
ํ•จ์ˆ˜ ์•ž์— async ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ,
async ํ•จ์ˆ˜ ๋‚ด์—์„œ๋งŒ await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

// ํ•จ์ˆ˜ ์„ ์–ธ์‹
async function funcDeclarations() {
	await ์ž‘์„ฑํ•˜๊ณ ์ž ํ•˜๋Š” ์ฝ”๋“œ
	...
}

// ํ•จ์ˆ˜ ํ‘œํ˜„์‹
const funcExpression = async function () {
	await ์ž‘์„ฑํ•˜๊ณ ์ž ํ•˜๋Š” ์ฝ”๋“œ
	...
}

// ํ™”์‚ดํ‘œ ํ•จ์ˆ˜
const ArrowFunc = async () => {
	await ์ž‘์„ฑํ•˜๊ณ ์ž ํ•˜๋Š” ์ฝ”๋“œ
	...
}

โฑ setTimeout์„ ์‚ฌ์šฉํ•œ ์˜ˆ์ œ

const printString = (string) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve();
      console.log(string);
    }, Math.floor(Math.random() * 100) + 1);
  });
};

const printAll = async () => {
  await printString('A');
  await printString('B');
  await printString('C');
};

printAll();
// A
// B
// C

๐Ÿ‘‰ ์ง€๊ธˆ ๋ฐ”๋กœ ๋™๊ธฐ์™€ ๋น„๋™๊ธฐ, ํƒ€์ด๋จธ ๊ด€๋ จ API(setTimeout...) ๋ณด๋Ÿฌ๊ฐ€๊ธฐ
๐Ÿ‘‰ callback, Promise, Async Await ์ฐจ์ด์  ํ•œ๋ˆˆ์— ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด?

profile
๐Ÿพ

0๊ฐœ์˜ ๋Œ“๊ธ€