๐ŸŸจ JavaScript/๊ฐœ๋…

[์ œ๋กœ์ดˆ] Promise์™€ ๋™๊ธฐ/๋น„๋™๊ธฐ ๊ด€๋ จ ์งค๋ง‰ ํ‚ค์›Œ๋“œ์ •๋ฆฌ

Zoeeey 2023. 9. 6. 20:06

https://sunshineyellow.tistory.com/64

์œ„๋Š” ๊ฐ™์ด ๋ณผ๋งŒํ•œ ๋“œ๋ฆผ์ฝ”๋”ฉ ์ฝœ๋ฐฑ์ง€์˜ฅ ํƒˆ์ถœ Promise ๊ธฐ์ดˆ ๊ฒŒ์‹œ๊ธ€.
์ œ๋กœ์ดˆ ์ธ๊ฐ„JS์—”์ง„ ๋ณด๋‹ค๊ฐ€ ์ถ”๊ฐ€์ ์ธ ํ‚ค์›Œ๋“œ ๋ฌธ์žฅ ์ •๋ฆฌ๊ฐ€ ํ•„์š”ํ•ด ์ž‘์„ฑํ•œ๋‹ค.


Promise๋ž€?

์‹คํ–‰์€ ๋๋Š”๋ฐ!!! ๊ฒฐ๊ณผ๊ฐ’์„ ๋‚˜์ค‘์— ์“ธ ์ˆ˜ ์žˆ๋‹ค.

"์‹คํ–‰์€ ๋๋Š”๋ฐ"๊ฐ€ ์ค‘์š”. ๊ทธ๋ž˜์„œ new Promise ์•ˆ์˜ ์ต๋ช…ํ•จ์ˆ˜๋Š” ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰์ด ๋œ๋‹ค.
๋™๊ธฐ๋น„๋™๊ธฐ ์‹คํ–‰์ˆœ์„œ ๊ด€๋ จํ•ด์„œ ์•„๋ž˜ ์ฝ”๋“œ๊ฐ€ ์ค‘์š”ํ•˜๋‹ค. ๊ธฐ์–ตํ•ด ๋†“์ž.

let a = 2;

const p = new Promise((resolve, reject) => {
  console.log('์‹คํ–‰1');
  setTimeout(() => {
    a = 5;
    console.log('์‹คํ–‰3', a);
    resolve(a);
  }, 0);
});
// ..๋”ด์ง“์ค‘
console.log('์‹คํ–‰2');
// ..๋”ด์ง“์ค‘
p.then((result) => {
  console.log('์‹คํ–‰4', result);
})

// ๊ฒฐ๊ณผ :
// ์‹คํ–‰1
// ์‹คํ–‰2
// ์‹คํ–‰3 5
// ์‹คํ–‰4 5

์œ„ ์ฝ”๋“œ์—์„œ ์•„๋ž˜ new Promise ์•ˆ์˜ ์ต๋ช…ํ•จ์ˆ˜๊ฐ€ ๋ฐ”๋กœ ํ˜ธ์ถœ๋ผ ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰์ด ๋˜์–ด๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰1์ด ๋จผ์ € ์‹คํ–‰ ๋œ๋‹ค. 

(resolve, reject) => {
  console.log('์‹คํ–‰1');
  setTimeout(() => {
    a = 5;
    console.log('์‹คํ–‰3', a);
    resolve(a);
  }, 0);
}

๊ทธ๋ฆฌ๊ณ ๋‚˜์„œ ๋™๊ธฐ์ ์ธ anonymus์— ์žˆ๋˜ ์‹คํ–‰2 console.log๊ฐ€ ์‹คํ–‰๋˜๊ณ ,
๊ทธ ํ›„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ๋„˜์–ด๊ฐ„ setTimeout(0์ดˆ๊ฐ€ ์ง€๋‚˜๋ฉด ์‹คํ–‰)๊ณผ then(resolve๋˜์–ด์•ผ ์‹คํ–‰)์ค‘ ์กฐ๊ฑด์„ ๋จผ์ € ๋งŒ์กฑ์‹œํ‚จ setTimeout ์‹คํ–‰3์ด ์‹คํ–‰๋œ๋‹ค.
๊ทธ ํ›„ ๊ทธ ์•ˆ์˜ resolve๊ฐ€ ๋œ then ์‹คํ–‰ 4๊ฐ€ ์‹คํ–‰๋œ๋‹ค.


+ ๋งคํฌ๋กœํƒœ์Šคํฌ์™€ ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ

๋งคํฌ๋กœํƒœ์Šคํฌ์™€ ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ๋Š” Node.js์—์„œ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์„ ์„ค๋ช…ํ•˜๋Š” ์šฉ์–ด๋‹ค. ๋™์‹œ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•œ ๋น„๋™๊ธฐํ˜ธ์ถœ๋“ค์ด ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.

๋งคํฌ๋กœํƒœ์Šคํฌ(Macro Task)

์ฃผ๋กœ ํƒ€์ด๋จธ, ์ด๋ฒคํŠธ๋ฆฌ์Šค๋„ˆ, ajax ์š”์ฒญ ๋“ฑ์ด ์—ฌ๊ธฐ ๋“ค์–ด๊ฐ„๋‹ค.
๋งคํฌ๋กœํƒœ์Šคํฌ๋Š” Node.js์˜ ์ด๋ฒคํŠธ ๋ฃจํ”„(event loop)์—์„œ ์ฒ˜๋ฆฌ๋˜๋ฉฐ, ์ด๋Ÿฌํ•œ ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋ฃจํ”„๊ฐ€ ๋ธ”๋กœํ‚น ์ƒํƒœ์— ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ(Micro Task)

์ฃผ๋กœ promise,process.nextTick ํ๊ฐ€ ์—ฌ๊ธฐ ๋“ค์–ด๊ฐ„๋‹ค.
๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ๋Š” ๋งคํฌ๋กœํƒœ์Šคํฌ๋ณด๋‹ค ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’๋‹ค. ์ด๋ฒคํŠธ ๋ฃจํ”„์˜ ๋‹ค์Œ ๋‹จ๊ณ„์— ๋จผ์ € ์‹คํ–‰๋œ๋‹ค.


async ๊ด€๋ จ ์ฃผ์˜์‚ฌํ•ญ

async๋กœ ์•ˆ ๊ฐ์‹ธ๋„ const result = await promise; ๋งŒ์œผ๋กœ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋ฐ”๋€Œ์—ˆ๋‹ค.

async๋กœ ๊ฐ์‹ธ์„œ ๋‚ด๋ถ€์—์„œ returnํ•œ ๊ฑด ๊ผญ ๋”ฐ๋กœ then์œผ๋กœ ๋ฐ›์•„์•ผ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  async๋กœ ๊ฐ์‹ผ await์€ catch๊ฐ€ ์•ˆ๋ผ์„œ  try+catch๋ฅผ ๋”ฐ๋กœ ํ•ด์ค˜์•ผ ํ•จ.

async function main() {
  try {
    const result = await promise;
    return result;
  } catch (error) {
    console.error(error);
  }
}
main().then((name) => ...);

allSettled

์ด์ œ all ๋ง๊ณ  allSettled๋ฅผ ๋งŽ์ด ์“ด๋‹ค. (๋ญ๊ฐ€ ์‹คํŒจํ–ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๊ณ , ์‹คํŒจํ•œ ๊ฒƒ๋งŒ ํ•„ํ„ฐ๋งํ•ด์„œ ๋‹ค์‹œ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ.)


catch

catch๋Š” ์•ž์˜ ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•œ catch๋‹ค. (p๋งŒ ๋ณด๋Š” catch๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๋œป)

p.then((result) => {
  console.log('result', result);
}).then(() => {
  // ์—๋Ÿฌ๋‚ฌ๋‹ค
}.then(() => {
  
}.then(() => {
  
}.then(() => {
  
}.catch(() => { // ์ด ์œ„๊นŒ์ง€์˜ ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•œ catch
  // ์—๋Ÿฌ๋กœ ์ด๋™
}

๊ทธ๋ž˜์„œ catch๋ฅผ ์‚ฌ์ด์‚ฌ์ด ๋ถ™์—ฌ๋„ ์ข‹๋‹ค.

p.then((result) => {
  console.log('result', result);
}).then(() => {
  
}.catch(() => { // ์ด ์œ„๊นŒ์ง€์˜ ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•œ catch
  
}.then(() => {
  
}.then(() => {
  
}.catch(() => { // ๊ทธ์ „ catch ์ดํ›„๋กœ๋ถ€ํ„ฐ ์œ„๊นŒ์ง€์˜ ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•œ catch
  
}.then(() => {
  
}.catch(() => { // ๊ทธ์ „ catch ์ดํ›„๋กœ๋ถ€ํ„ฐ ์œ„๊นŒ์ง€์˜ ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•œ catch
  
}

์ถœ์ฒ˜ : ์ œ๋กœ์ดˆ ์œ ํŠœ๋ธŒ ์ธ๊ฐ„JS์—”์ง„๋˜๊ธฐ