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

C-log

JS์˜ ํ•ต์‹ฌ! ํ˜ผํ”„~ with setTimeout()&Promise ๋ณธ๋ฌธ

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

JS์˜ ํ•ต์‹ฌ! ํ˜ผํ”„~ with setTimeout()&Promise

4:Bee 2023. 4. 25. 17:59
728x90

ํ˜ผํ”„๋Š” ํ˜ผ์ž ํ”„๋กœ์ ํŠธ์˜ ์•ฝ์ž์ด๋‹ค.


ํ˜ผ์ž ํ”„๋กœ์ ํŠธ ์ด๋ฆ„์€ 'delivery ๋ˆ„๊ฐ€ ๋จผ์ € ๋„์ฐฉํ•˜๋‚˜' ์ด๋‹ค. setTimeout์„ ํ†ตํ•œ ๋น„๋™๊ธฐ์  ๋™์ž‘์„ ์‚ดํŽด๋ณด๊ธฐ ์œ„ํ•ด ๋งŒ๋“  ์ž‘์—…์ด๋‹ค. ์–ด๋ ค์šด ์ฝ”๋“œ๋Š” ์•„๋‹ˆ์ง€๋งŒ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‰ฝ๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

function delay(name) {
  //random time
  const ms = Math.floor(Math.random() * 11) * 1000
  console.log(`start ${name}!! delivery need ${ms / 1000}second`)
  return setTimeout(() => console.log(`${name} is Arrived! ${ms}`), ms);
}
delay('delivery1')
delay('delivery2')
delay('delivery3')

์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๋ฉด ๋น„๋™๊ธฐ์ ์ธ ๋ชจ์Šต์ด ์ž˜ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š๋Š”๋‹ค.

์œ„ ๊ฒฐ๊ณผ๋งŒ ๋ณด๋”๋ผ๋„ ๋‹จ์ˆœํžˆ ์ˆœ์ฐจ์ ์œผ๋กœ ์ดํ–‰ํ•œ ๊ฒƒ ์ฒ˜๋Ÿผ๋ณด์ด์ง€๋งŒ  ์กฐ๊ธˆ ๋” ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ „ํ˜€ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค. ๋งŒ์•ฝ ์šฐ๋ฆฌ๊ฐ€ ๋น„๋™๊ธฐํ•จ์ˆ˜์ธ setTimeout์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๋‹ค๋Ÿฌ๋ผ๋ฉด ํ•˜๋‚˜์˜ ํฐ ์‹œ๊ฐ„(์ฆ๊ฐ)ํ•จ์ˆ˜๋ฅผ ์ œ์ž‘ํ•˜๊ณ  ๊ทธ ์•ˆ์—์„œ randomํ•จ์ˆ˜๋ฅผ ์ œ์ž‘ํ•˜๊ณ  ์ดํ›„ randomํ•จ์ˆ˜์—์„œ ํŠน์ • ๊ฐ’ ๋ณ€์ˆ˜๋ฅผ ๋ฐ›๊ณ  ํŠน์ • random๊ฐ’์„ ๋ฐ›์€ ๋ณ€์ˆ˜๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์กฐ๊ฑด๋ฌธ(if,switch/case)๋ฌธ๊ณผ ๊ฐ™์€ ์กฐ๊ฑด์„ ๋งŒ๋“ค์–ด ํ•ด๋‹น delivery๊ฐ€ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๋„์ฐฉ ์‹œ๊ฐ„์„ ๋ฐœ์ƒํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ๋น„๋™๊ธฐ๊ฐ€ ์•„๋‹ˆ๋‹ค.

์œ„ ์ฝ”๋“œ๋ฅผ ์˜ˆ์‹œ๋กœ ๋น„๋™๊ธฐ๋ฅผ ์„ค๋ช…ํ•˜์ž๋ฉด ์ฒซ ๋ฒˆ์งธ delay('delivery1')ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด์„œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ธ setTimeout์ด ํ•ด๋‹น ์นด์šดํŠธ๋ฅผ ํ•˜๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค. ๊ทธ ์‚ฌ์ด์— ๋‘ ๋ฒˆ์งธ delay('delivery2')ํ•จ์ˆ˜๊ฐ€  ํ˜ธ์ถœ๋˜๋ฉด์„œ setTimeout์ด ํ•ด๋‹น ์นด์šดํŠธ๋ฅผํ•œ๋‹ค. (์œ„์˜ ํ•จ์ˆ˜๊ฐ€ ๋™์‹œ์— ์‹œ์ž‘ํ–ˆ๋‹ค ๋ณด๊ธฐ์— ์–ด๋ ต๋‹ค. JS๋Š” ์ˆœ์ฐจ์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ํŒŒ์‹ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.) ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋™์‹œ์— ์„œ๋กœ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. 

์กฐ๊ธˆ ๋” ์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•ด setIntervalํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด setTimeoutํ•จ์ˆ˜๊ฐ€ ๋ฐœ๋™ํ•˜๊ณ  ์žˆ๋Š” ๋™์‹œ์— ๋‹ค๋ฅธ ์ž‘์—…์ด ๋™์‹œ์— ์ด๋ฃจ์–ด์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ง๊ด€์ ์œผ๋กœ ํ‘œํ˜„ํ•ด ๋ดค๋‹ค. 

function delay(name) {
  //random time
  const ms = Math.floor(Math.random() * 11) * 1000
  console.log(`start ${name}!! delivery need ${ms / 1000}second`)
  return setTimeout(() => console.log(`${name} is Arrived! ${ms}`), ms);
}
 
let time = 0;
function checkTime() {
  time += 1;
  console.log(time);
  if (time === 10) { console.log("stop"); stop(); }
}
let isTime = setInterval(checkTime, 1000);
function stop() { clearInterval(isTime) }

delay('delivery1')
delay('delivery2')
delay('delivery3')

๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

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

์ฐธ๊ณ ๋กœ setTimout์€ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์ง€์ •ํ•œ ์ดํ›„ ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚œ ํ›„ ํ•ด๋‹น ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‚ด์žฅ ํ•จ์ˆ˜ ์ด๋‹ค.


promise๋กœ ์ด๋ฃจ์–ด์ง„ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

๋žœ๋ค๊ฐ’์ด ๋‚˜์˜ค๊ณ  ๋ฐฐ๋‹ฌ ์Šน์ธ ์—ฌ๋ถ€์— ๋”ฐ๋ผ res์™€ reject๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ๋‚˜์˜ค๊ณ  ์ด์— ๋”ฐ๋ผ ๋ฐฐ๋‹ฌ ์‹œ๊ฐ„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฐฐ๋‹ฌ์˜ ์Šน์ธ ์—ฌ๋ถ€๊ฐ€ ๋ฐ”๋€Œ๊ฒŒ ๋งŒ๋“ ๋‹ค. 0:์€ ๊ฐ•๋ถ๊ตฌ์ง€์—ญ, 1: ๋…ธ์›๊ตฌ์ง€์—ญ, 2: ๊ฐ•๋‚จ๊ตฌ์ง€์—ญ ๋“ฑ

let delivery = (name) => {
  let delay = Math.floor((Math.random() * 10) + 1) * 1000;//๊ฐ ๋ฐฐ๋‹ฌ์›์ด ํ• ๋‹น ๋ฐ›์•„์•ผํ•  ์‹œ๊ฐ„
  let test = Math.floor((Math.random() * 10) + 1) * 1000;
  console.log(`start ${name}!! delivery need ${delay / 1000}second`)
  return new Promise(
    (resolve, reject) => {
      setTimeout(function () { resolve(`${name} is Arrived! ${delay} / ${test}`) }, delay)//
      console.log(`delay => ${delay}`);
    }
  )
}
let time = 0;

let isTime = setInterval(
  () => {//ํ•ด๋‹น ํ•จ์ˆ˜ ๋ฐœ๋™
    time += 1;
    console.log(time);
    if (time === 10) { console.log("stop"); stop(); }
  }, 1000);

//setInterval ์ œ๊ฑฐ ํ•จ์ˆ˜
function stop() { clearInterval(isTime) }

delivery('delivery1').then((done) => { console.log(done) });
delivery('delivery2').then((done) => { console.log(done) });
delivery('delivery3').then((done) => { console.log(done) });

์—ฌ๊ธฐ์„œ ๋‚˜์ค‘์— ๋‹ค์‹œ ์‚ดํŽด๋ณด๊ณ  ์‹ถ์€ ๊ฒƒ์€ ๊ฒƒ์€ ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด delay๋ฅผ ์ „์—ญ ๋ณ€์ˆ˜ ๊ฐ’์œผ๋กœ ๋‘์—ˆ์„ ๋•Œ์™€ ๊ฐ’์ด ๋‹ค๋ฅด๊ฒŒ ๋‚˜์˜ค๋Š” ๋ถ€๋ถ„์ด๋‹ค. ๋‘ ๊ฒฐ๊ณผ ๊ฐ’์˜ ์ฐจ์ด๋ฅผ ์‚ดํŽด ๋ณด์ž. chat gpt๋ฅผ ํ†ตํ•ด ๋‹ต์„ ์–ป์–ด ๋ณด์•˜์ง€๋งŒ ์™„์ „ํžˆ ์ดํ•ด๊ฐ€์ง€ ์•Š์•˜๋‹ค.

let delay = 0;

let delivery = (name) => {
  delay = Math.floor((Math.random() * 10) + 1) * 1000;//๊ฐ ๋ฐฐ๋‹ฌ์›์ด ํ• ๋‹น ๋ฐ›์•„์•ผํ•  ์‹œ๊ฐ„
  let test = Math.floor((Math.random() * 10) + 1) * 1000;
  console.log(`start ${name}!! delivery need ${delay / 1000}second`)
  return new Promise(
    (resolve, reject) => {
      setTimeout(function () { resolve(`${name} is Arrived! ${delay} / ${test}`) }, delay)//
      console.log(`delay => ${delay}`);
    }
  )
}


์—ฌ๊ธฐ๊นŒ์ง€ setTimeout๊ณผ Promise๋ฅผ ํ™œ์šฉํ•œ ๋น„๋™๊ธฐ์˜ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ํŒŒ์•…ํ•ด ๋ณด์•˜๋‹ค. ์ „๋ฐ˜์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๋ฐฉ์‹์„ ์ดํ•ดํ–ˆ์„ ๊ฒƒ์ด๋ผ ๋ณธ๋‹ค. ์•„์‰ฝ๊ฒŒ๋„ Promise์˜ then๊ตฌ๋ฌธ๊ณผ sesolve ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉ ํ•ด๋ณด์•˜์œผ๋‚˜. catch์™€ reject ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์•„์ง ๋‹ค๋ฃจ์–ด ๋ณด์ง€ ๋ชปํ–ˆ๋‹ค. ์ฐจํ›„์— ์ด ํฌ์ŠคํŒ…์— ์ถ”๊ฐ€ํ•ด์„œ ์ž‘์„ฑ ํ•ด๋ณด๊ฒ ๋‹ค.

 

๋™๊ธฐ์™€ ๋น„๋™๊ธฐ์˜ ๊ฐœ๋…๊ณผ ์ฐจ์ด

๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๋Š” ๋ฐฉ์‹์ธ ๋™๊ธฐ์™€ ๋น„๋™๊ธฐ. ์ด ๋‘˜์˜ ๊ฐœ๋…๊ณผ ์ฐจ์ด์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋™๊ธฐ (Synchronous : ๋™์‹œ์— ์ผ์–ด๋‚˜๋Š”) ๋™์‹œ์— ์ผ์–ด๋‚œ๋‹ค๋Š” ๋œป์ด๋‹ค. ์š”์ฒญ๊ณผ ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ๋™์‹œ์— ์ผ์–ด๋‚œ๋‹ค๋Š” ์•ฝ์†์ด

dreamcoding.tistory.com

<๋น„๋™๊ธฐ์™€ ๋™๊ธฐ๋ฅผ ๊ทธ๋ฆผ์œผ๋กœ ์‰ฝ๊ฒŒ ์ž˜ ์„ค๋ช…ํ•œ ๊ธ€์ด๋‹ค.>

728x90
Comments