๊ด€๋ฆฌ ๋ฉ”๋‰ด

C-log

section27-๋น„๋™๊ธฐ์‹ JavaScript ๋ณธ๋ฌธ

๐Ÿ“’JS/โšกver.0

section27-๋น„๋™๊ธฐ์‹ JavaScript

4:Bee 2023. 3. 30. 13:41
728x90

 

Topic explain class
The Call Stack
 ์ฑ…์„ ์ฝ์„ ๋•Œ ์†๊ฐ€๋ฝ์œผ๋กœ ์งš์–ด๊ฐ€๋Š” ํ–‰์œ„์™€ ๋น„์Šทํ•˜๋‹ค.
์ฝœ์Šคํƒ์„ ์„ค๋ช…ํ•˜๊ธฐ ์•ž์„œ
์Šคํƒ์€ ์ด์ „์— ์–ธ๊ธ‰ํ–ˆ๋˜ ๋ฐฐ์—ด์˜ push, popm shift,unshift์™€ ๊ฐ™๋‹ค.
์Šคํƒ์€ ์ปดํ“จํ„ฐ ๊ณผํ•™์˜ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ด๋‹ค.
ํ›„์ž…์„ ์ถœ(LIFO) ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋กœ ์•Œ๋ ค์ ธ ์žˆ๋‹ค. - ํŒฌ์ผ€์ดํฌ

 ์ฝœ ์Šคํƒ์€ JS๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค. ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ์—์„œ ํ•ด๋‹น ์œ„์น˜๋ฅผ ์ถ”์ ํ•œ๋‹ค.
...(๋งŽ์€ ๋‚ด์šฉ์ด ์ƒ๋žต)

์ฝ”๋“œ๋ฅผ ํ†ตํ•œ ํ•จ์ˆ˜ ํ‘œํ˜„


์ฝœ ์Šคํƒ์˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ ํ‘œํ˜„

์ฝœ ์Šคํƒ(Call Stack)

loupe Site : 

http://latentflip.com/loupe/?code=JC5vbignYnV0dG9uJywgJ2NsaWNrJywgZnVuY3Rpb24gb25DbGljaygpIHsKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gdGltZXIoKSB7CiAgICAgICAgY29uc29sZS5sb2coJ1lvdSBjbGlja2VkIHRoZSBidXR0b24hJyk7ICAgIAogICAgfSwgMjAwMCk7Cn0pOwoKY29uc29sZS5sb2coIkhpISIpOwoKc2V0VGltZW91dChmdW5jdGlvbiB0aW1lb3V0KCkgewogICAgY29uc29sZS5sb2coIkNsaWNrIHRoZSBidXR0b24hIik7Cn0sIDUwMDApOwoKY29uc29sZS5sb2coIldlbGNvbWUgdG8gbG91cGUuIik7!!!PGJ1dHRvbj5DbGljayBtZSE8L2J1dHRvbj4%3D
๋””๋ฒ„๊น…์„ ํ†ตํ•ด์„œ ์ฝœ ์Šคํƒ์˜ ์›€์ง์ž„๊ณผ ๋ณ€๋™์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.
JS is Single Threaded JS๋Š” ์ผ์„ ํ•˜๋‚˜์”ฉ ๋ฐ–์— ๋ชปํ•œ๋‹ค. 
ํ•˜์ง€๋งŒ ์ตœ๋Œ€ํ•œ ํ•œ ๋ฒˆ์— ํ•œ์ค„์”ฉ๋งŒ ์ง‘์ค‘ํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ด๋„ ํ•ด๊ฒฐํ• ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.
setTimeout(~)์„ ์˜ˆ์‹œ๋กœ ๋ณด๋ฉดํ•˜๋ฉด ๋œ๋‹ค.

์™œ setTimeout์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์•„๋ž˜ log๊ฐ€ ์‹คํ–‰์ด ๋ ๊นŒ?

JS๊ฐ€ ๋‹จ์ผ ์“ฐ๋ ˆ๋“œ์ด๋ฉด ๋ชจ๋‘ ๋ฉˆ์ถ”๊ณ  setTimeout์„ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ๊ฑฐ ์•„๋‹Œ๊ฐ€?

-์™œ ์ด๋Ÿฌ๋Š”์ง€ ์ž‘๋™์›๋ฆฌ๋ฅผ ๋ณด์ž
JS๋Š” ์ฝ”๋“œ์ผ๋ฟ ์‹คํ–‰ํ•˜๊ณ  ์žˆ๋Š” ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋ณด์•„์•ผํ•œ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฌด์—‡์ด ๋˜์—ˆ๋“  (๋Œ€๊ฐœ๋Š” C++๋กœ ์ด๋ฃจ์–ด์ง€๊ณ  ์ž‘์„ฑ๋˜์–ด์ ธ ์žˆ๋‹ค.)๋ธŒ๋ผ์šฐ์ €๋Š” JS๊ฐ€ ํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ๋“ค์„ ํ•œ๋‹ค.
๋”ฐ๋ผ์„œ JS๋Š” ์‹ค์ œ๋กœ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์ • ์ž‘์—…์„ ๋„˜๊ธด๋‹ค. ๊ทธ ํŠน์ • ์ž‘์—…์ด ๋ฐ”๋กœ WebAPIs๋ผ๋Š” ๊ฒƒ์ด๋‹ค.
WebAPIs๋Š” JS๋ฅผ ํ†ตํ•ด ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „๋‹ฌ๋œ๋‹ค.
(์—ฌ๊ธฐ์„œ JS๊ฐ€ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์€ ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ์š”์ฒญํ•œ๋‹ค. ์ด๋Ÿฐ ์ผ์€ ๋ฐฐํ›„์—์„œ ์ผ์–ด๋‚œ๋‹ค.)
JS์˜ ์ฝœ ์Šคํƒ์— WebAPI ํ•จ์ˆ˜(setTimeout)๋ผ๋Š” ๊ฒƒ์„ ์ธ์‹ํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „๋‹ฌ ๊ทธ๋ฆฌ๊ณ  ๋ฐ”๋กœ JS๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ๋™์ž‘(๋ช…๋ น์–ด)์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
WebAPI์™€ ๋‹จ์ผ ์Šค๋ ˆ๋“œ
CallBackHELL - Callback์ด๋ž€ ์ง€์˜ฅ :(
ENTER PROMISES




Promise๋Š” ์–ด๋–ค ์—ฐ์‚ฐ, ๋น„๋™๊ธฐ ์—ฐ์‚ฐ์ด ์ตœ์ข…์ ์œผ๋กœ ์™„๋ฃŒ ํ˜น์€ ์„ฑ๊ณตํ–ˆ๋Š”์ง€ ์‹คํŒจํ–ˆ๋Š” ์•Œ๋ ค์ฃผ๋Š” ๊ฐ์ฒด์ด๋‹ค.
fakeRequest๋ฅผ ํ†ตํ•ด ๊ตฌ์กฐ๋งŒ ๋ณด์•˜์„ ๋• ์‹คํŒจ์™€ ์„ฑ๊ณต์˜ ๋‘ ๊ฐˆ๋ฆผ๊ธธ๋กœ๋งŒ ๋ณด์ธ๋‹ค.
Callback์„ ์‚ฌ์šฉํ•œ fakeRequest
Promise๋Š” ํ•˜๋‚˜์˜ ๊ฐ์ฒด์ด๋‹ค.์ตœ์ข… ๊ฐ’์ด๋‚˜ ์ž‘๋™์—ฌ๋ถ€์— ๋Œ€ํ•œ ์•ฝ์†์ด๋‹ค. Promise๋ฅผ ์‚ฌ์šฉํ•œ fakeRequest
Promise์˜ ์ƒํƒœ๋ฅผ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด์ž ์ž์‹ ๋งŒ์˜ Promises๋งŒ๋“ค๊ธฐ 


new Promise((resolve, reject) => {
  resolve();
})//fullfiled

new Promise((resolve, reject) => {
  reject();
})//Uncaught (in promise) 

new Promise((resolve, reject) => {
})//pending
๊ฐ€์ž Request๋ฅผ ํ†ตํ•ด์„œ Promise๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ฝ์–ด๋ณด๊ณ  ๋ถ„์„ํ•ด๋ณด์ž
const fakeRequest = (url) => {
  return new Promise((resolve, reject) => {
    const rand = Math.random();
    setTimeout(() => {
      if (rand < 0.7) {
        resolve('YOUR FAKE DATA HERE');
      }
      reject('Request Error!');
    }, 1000)
  })
}

fakeRequest('/dogs/1')
  .then((data) => {
    console.log("DONE WITH REQUEST!");
    console.log("data is: ", data);
  })
  .catch((err) => {
    console.log("OH, NO!", err)
  })
ASYNC FUNCTIONS
 
 
 
 




๋น„๋™๊ธฐ : ํŠน์ • ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
๋น„๋™๊ธฐ ํ•จ์ˆ˜ : ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ์•„์ฃผ ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค.
Promise์™€ ๋ฐ€์ ‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž˜ ์•Œ์•„๋‘๋ฉด ์ข‹๋‹ค.
 ๋น„๋™๊ธฐ ํ‚ค์›Œ๋“œ
 
 
 
Async : ํ•จ์ˆ˜๋ฅผ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋กœ ์„ ์–ธํ•˜๋Š” ํ‚ค์›Œ๋“œ, ํ•จ์ˆ˜ ์•ž์— ์ž‘์„ฑ์„ ํ•œ๋‹ค. Async๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋™์ ์œผ๋กœ promise๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.(์ง์ ‘ retrun๊ฐ™์€ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ์•”๋ฌต์ ์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.)
throw
const login = async (username, password) => {
  if (!username || !password) throw 'Missing Credentials';
  if (password === 'rdwoo') return 'Welcome'
  throw 'Invalid Password';
}

login('fdfadf')
  .then(msg => {
    console.log("Logged in!")
    console.log(msg);
  })
  .catch(err => {
    console.log('ERROR!')
    console.log(err);
  })

์—ฌ๊ธฐ์„œ msg์˜ ๋ชจ์–‘๊ณผ ๋ชจ์Šต์ด ์•„์ด๋Ÿฌ๋‹ˆํ–ˆ๋‹ค. ์•Œ๊ณ  ๋ดค๋”๋‹ˆ =>{}์•ˆ์— ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ ํ›„์˜ ๋ฐ˜ํ™˜๊ฐ’์ด msg์— ๊ฐ’์ด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.


Await : ๋น„๋™๊ธฐ๋ฅผ ๋™๊ธฐ์ ์œผ๋กœ ๋ณด์ด๊ฒŒ ํ•œ๋‹ค. ๋Œ€๊ธฐ ํ‚ค์›Œ๋“œ
 
 
async function rainbow() {
  await DelayedColorChange('red', 1000);
  await DelayedColorChange('orange', 1000);
  await DelayedColorChange('green', 1000);
  await DelayedColorChange('yellow', 1000);
  await DelayedColorChange('#006d77', 1000);
  await DelayedColorChange('violet', 1000);
  return console.log("ALL DONE");
}
// rainbow().then(() => console.log("END OF RAINBOW!"))

async function printRainbow() {
  await rainbow();
  console.log("END OF RAINBOW!");
}

printRainbow();
Async์˜ Error ์žก๊ธฐ : try,catch  ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌํ•˜๊ธฐ
 
async function makeTwoRequests() {
    try {
        let data1 = await fakeRequest('./page1');
        console.log(data1);
        let data2 = await fakeRequest('./page2');
        console.log(data2);
    }
    catch (e) {
        console.log("CAUGHT AN ERROR!");
        console.log("error is : ", e);
    }

}

 

 

728x90
Comments