codeStates front-end/Java Script

[JS] chapter19. ๋น„๋™๊ธฐ1 - java script

ํ™˜ํ…Œํฌ 2023. 1. 17. 15:52
๋ฐ˜์‘ํ˜•

 

 

 

 

 

 

 

๐Ÿ“Œ ๋น„๋™๊ธฐ

 

 

- ๋™๊ธฐ(synchronous)

๋™๊ธฐ ์ฒ˜๋ฆฌ๋ž€, ํŠน์ • ์ฝ”๋“œ์˜ ์‹คํ–‰์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ๋‚œ ํ›„ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ

 

- ๋น„๋™๊ธฐ(asynchronous)

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ž€, ํŠน์ • ์ฝ”๋“œ์˜ ์‹คํ–‰์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ

js๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜ ๋™์ž‘ ์–ธ์–ด๋ผ์„œ ๋™๊ธฐ์  ์ž‘๋™์ด์ง€๋งŒ ํ™˜๊ฒฝ(๋Ÿฐํƒ€์ž„)์—์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ๋„์™€์ฃผ๊ธฐ ๋•Œ๋ฌธ์—

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋˜ํ•œ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋น„๋™๊ธฐ๋Š” ์ˆœ์„œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์ž!

 

 

 

 

โฑ ํƒ€์ด๋จธ ๊ด€๋ จ API

๋น„๋™๊ธฐ ์ฒซ๋ฒˆ์งธ ๋‹จ๊ณ„ ํƒ€์ด๋จธ ๊ด€๋ จ API

 

 

 

setTimeout(callback, millisecond)

 

์ผ์ • ์‹œ๊ฐ„ ํ›„์— ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰

 

  • ๋งค๊ฐœ๋ณ€์ˆ˜(parameter): ์‹คํ–‰ํ•  ์ฝœ๋ฐฑ ํ•จ์ˆ˜, ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์‹คํ–‰ ์ „ ๊ธฐ๋‹ค๋ ค์•ผ ํ•  ์‹œ๊ฐ„ (๋ฐ€๋ฆฌ์ดˆ)
  • return ๊ฐ’: ์ž„์˜์˜ ํƒ€์ด๋จธ ID
setTimeout(function () {
  console.log('1์ดˆ ํ›„ ์‹คํ–‰');
}, 1000);
// 123

 

 

clearTimeout(timerId)

 

setTimeout ํƒ€์ด๋จธ๋ฅผ ์ข…๋ฃŒ

 

  • ๋งค๊ฐœ๋ณ€์ˆ˜(parameter): ํƒ€์ด๋จธ ID
  • return ๊ฐ’: ์—†์Œ
const timer = setTimeout(function () {
  console.log('10์ดˆ ํ›„ ์‹คํ–‰');
}, 10000);
clearTimeout(timer);
// setTimeout์ด ์ข…๋ฃŒ๋จ.

 

setInterval(callback, millisecond)

 

์ผ์ • ์‹œ๊ฐ„์˜ ๊ฐ„๊ฒฉ์„ ๊ฐ€์ง€๊ณ  ํ•จ์ˆ˜๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‹คํ–‰

  • ๋งค๊ฐœ๋ณ€์ˆ˜(parameter): ์‹คํ–‰ํ•  ์ฝœ๋ฐฑ ํ•จ์ˆ˜, ๋ฐ˜๋ณต์ ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ธฐ ์œ„ํ•œ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ (๋ฐ€๋ฆฌ์ดˆ)
  • return ๊ฐ’: ์ž„์˜์˜ ํƒ€์ด๋จธ ID

setInterval(function () {
  console.log('1์ดˆ๋งˆ๋‹ค ์‹คํ–‰');
}, 1000);
// 345

 

clearInterval(timerId)

 

setInterval ํƒ€์ด๋จธ๋ฅผ ์ข…๋ฃŒ

  • ๋งค๊ฐœ๋ณ€์ˆ˜: ํƒ€์ด๋จธ ID
  • return ๊ฐ’: ์—†์Œ

const timer = setInterval(function () {
  console.log('1์ดˆ๋งˆ๋‹ค ์‹คํ–‰');
}, 1000);
clearInterval(timer);
// setInterval์ด ์ข…๋ฃŒ๋จ.

 

 

 

 

๋น„๋™๊ธฐ๋กœ ์ž‘๋™ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•1 - ์ฝœ๋ฐฑํ•จ์ˆ˜

 

 

์ œ์–ดํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ

 

// ํ„ฐ๋ฏธ๋„์— `node index.js`๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๋น„๋™๊ธฐ ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ์ˆœ์„œ๋ฅผ ํ™•์ธํ•ด๋ณด์„ธ์š”.
const printString = (string) => {
  setTimeout(function () {
    console.log(string);
  }, Math.floor(Math.random() * 100) + 1);
};

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

printAll();

console.log(`์•„๋ž˜์™€ ๊ฐ™์ด ๋น„๋™๊ธฐ ์ฝ”๋“œ๋Š” ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค!`);

 

 

์ œ์–ด๋œ ์ฝ”๋“œ

 

์ฃผ์˜์‚ฌํ•ญ

 

๐Ÿ“ ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์ง€๊ณ  ๋ณต์žกํ•  ์ˆ˜๋ก ๊ฐ€๋…์„ฑ์˜ ๋‚ฎ์•„์ง€๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

 

// ํ„ฐ๋ฏธ๋„์— `node index.js`๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๋น„๋™๊ธฐ ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ์ˆœ์„œ๋ฅผ ํ™•์ธํ•ด๋ณด์„ธ์š”.
const printString = (string, callback) => {
  setTimeout(function () {
    console.log(string);
    callback(); // ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ˆœ์„œ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค
  }, Math.floor(Math.random() * 100) + 1);
};

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

printAll();

console.log(
  `์•„๋ž˜์™€ ๊ฐ™์ด Callback ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ ์ฝ”๋“œ์˜ ์ˆœ์„œ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!`
);

 

 

๋น„๋™๊ธฐ๋กœ ์ž‘๋™ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•2 - Promise

 

new Promise

 

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

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

์ด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” resolve, reject ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ

 

promise ๊ฐ์ฒด ์ƒ์„ฑ -> resolve ํ•จ์ˆ˜ ํ˜ธ์ถœ -> ์—๋Ÿฌ ๋ฐœ์ƒ ๊ฒฝ์šฐ reject ํ•จ์ˆ˜ ํ˜ธ์ถœ

 

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

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

 

promise ๊ฐ์ฒด ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ

 

state : ๋Œ€๊ธฐ

result : undefined -> value -> error

then : .then ๋ฉ”์„œ๋“œ ์ ‘๊ทผ

 

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

promise.then(value => {
	console.log(value);
	// "์„ฑ๊ณต"
})

 

catch : ์—๋Ÿฌ ๋ฐœ์ƒ์‹œ reject ํ•จ์ˆ˜ ํ˜ธ์ถœ

 

let promise = new Promise(function(resolve, reject) {
	reject(new Error("์—๋Ÿฌ"))
});

promise.catch(error => {
	console.log(error);
	// Error: ์—๋Ÿฌ
})

 

finally : ์ •์ƒ ์ฒ˜๋ฆฌ ์—ฌ๋ถ€ ๊ด€๊ณ„ ์—†์ด finally๋ฉ”์„œ๋“œ๋กœ ์ ‘๊ทผ

 

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

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

 

Promise chaining

 

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

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

.then์„ ํ†ตํ•ด ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๊ณ , ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ .catch ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋œ๋‹ค

 

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

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('์„ฑ๊ณต์ด๋“  ์‹คํŒจ๋“  ์ž‘๋™!');
  });

 

Promise.all

 

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));

 

๊ธฐ์กด Promise chaining์„ promise.all๋กœ๋„ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ

 

// promise.all
Promise.all([promiseOne(), promiseTwo(), promiseThree()])
  .then((value) => console.log(value))
  // ['1์ดˆ', '2์ดˆ', '3์ดˆ']
  .catch((err) => console.log(err));

 

+ Promise.all()์€ ํ•˜๋‚˜๋ผ๋„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ ํ•˜๋ฉด ์ฆ‰์‹œ ์ข…๋ฃŒ

ex) 1์ดˆ ํ›„์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  error:1์ด ๋ฐ˜ํ™˜๋œ ํ›„๋กœ๋Š” ์ž‘๋™ x

 

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 Hell

 

Promise๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ ์ฝ”๋“œ์˜ ์ˆœ์„œ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์ง€๋งŒ Callback ํ•จ์ˆ˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์งˆ์ˆ˜๋ก ๋ณต์žกํ•ด์ง€๊ณ 

๊ฐ€๋…์„ฑ์ด ๋‚ฎ์•„์ง€๋Š” Promise Hell์ด ๋ฐœ์ƒํ•˜๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค

 

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

const printAll = () => {
  printString('A').then((value) => {
    console.log(value);

    printString('B').then((value) => {
      console.log(value);

 

 

 

 

 

๐Ÿช„ Async/Await (์ค‘์š”)

 

๋ณต์žกํ•œ promise ์ฝ”๋“œ ๋Œ€์‹  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑ ๊ฐ€๋Šฅ

ํ•จ์ˆ˜ ์•ˆ์— async ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  async ํ•จ์ˆ˜ ๋‚ด์—์„œ๋งŒ await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉ

 

 

๋ฐ˜์‘ํ˜•