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

C-log

setTimeout์€ ์™œ ๋น„๋™๊ธฐ์ธ๊ฐ€? ๋ณธ๋ฌธ

๐Ÿ› ๏ธ๊ธฐ์ˆ  ๋Œ€๋น„

setTimeout์€ ์™œ ๋น„๋™๊ธฐ์ธ๊ฐ€?

4:Bee 2024. 3. 13. 15:45
728x90

#setTimeout์€ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ๋Œ€ํ‘œ์ ์ธ ํ•จ์ˆ˜์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด setTimeout์€ ์™œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ธ๊ฐ€?

setTimeoutํ•จ์ˆ˜๋Š” ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚œ ํ›„์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚˜๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋‚˜ ์ฝ”๋“œ๋“ค์ด setTimeout์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ์‹คํ–‰์ด ๋œ๋‹ค. ์ด๋Š” ๋™๊ธฐ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

##์ด ์™ธ์—๋„ ๋‹ค๋ฅธ ์ด์œ 

๋”๋ณด๊ธฐ
  1. ๋น„๋™๊ธฐ์  ์‹คํ–‰: setTimeout ํ•จ์ˆ˜๋Š” ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚œ ํ›„์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ์˜ˆ์•ฝํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ setTimeout ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ์ฝ”๋“œ์˜ ์‹คํ–‰์ด ์ง€์—ฐ๋˜๊ณ , ๋‹ค์Œ ์ฝ”๋“œ ๋ธ”๋ก์ด ์‹คํ–‰๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์ฆ‰์‹œ ๋‹ค์Œ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
  2. ๋ธ”๋กœํ‚นํ•˜์ง€ ์•Š์Œ: setTimeout ํ•จ์ˆ˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์˜ˆ์•ฝํ•œ ํ›„์—๋„ ํ”„๋กœ๊ทธ๋žจ์ด ๋ธ”๋กœํ‚น๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, setTimeout์œผ๋กœ ์˜ˆ์•ฝ๋œ ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๊ณ„์† ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ์ด๋ฒคํŠธ ๋ฃจํ”„์™€ ํ•จ๊ป˜ ๋™์ž‘: JavaScript์˜ ์ด๋ฒคํŠธ ๋ฃจํ”„(Event Loop)๋Š” ๋น„๋™๊ธฐ์ ์ธ ์ž‘์—…์„ ๊ด€๋ฆฌํ•˜๊ณ  ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. setTimeout ํ•จ์ˆ˜๋กœ ์˜ˆ์•ฝ๋œ ์ž‘์—…์€ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

# ์ฝ”๋“œ๋กœ ๋ณด๋Š” ์˜ˆ์‹œ

๋”๋ณด๊ธฐ
function callSetTimeOut(){
    setTimeout(()=>{ return console.log('1 - call!')},3000);
}
callSetTimeOut();
console.log('2 - call');
console.log('3 - call');

์œ„์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด 2,3,1์ด๋ผ๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค. ์ด๋Š” ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” setTimeoutํ•จ์ˆ˜ ๋•Œ๋ฌธ์ด๋‹ค. ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” promise, thne์„ ์‚ฌ์šฉํ•ด์„œ ๋น„๋™๊ธฐ๋ฅผ ๋™๊ธฐ์ ์œผ๋กœ ๋ณ€ํ™˜์„ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

## pormise, then์„ ์‚ฌ์šฉํ•ด์„œ ์ž‘์„ฑํ•˜๊ธฐ

function callSetTimeOut(){
    return new Promise((resolve, reject) => {
        setTimeout(() => {
			console.log('1 - call!');
            resolve(); // ๋น„๋™๊ธฐ ์ž‘์—… ์™„๋ฃŒ ํ›„ ํ”„๋กœ๋ฏธ์Šค ํ•ด๊ฒฐ
        }, 3000);
    });
}

callSetTimeOut().then(() => console.log('2 - call')).then(() => console.log('3 - call'));

์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด 1,2,3์ด๋ผ๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š”๋‹ค. ๋™๊ธฐ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ promise, then์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝœ๋ฐฑ ์ง€์˜ฅ์—์„œ ๋ฒ—์–ด ๋‚  ์ˆ˜ ์žˆ๋‹ค.
(resolve์—๋Š” ์™„๋ฃŒ๋œ ๊ฐ’์„ ์ „๋‹ฌํ•˜๊ณ , reject์—๋Š” ์—๋Ÿฌ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋“ค ํ•จ์ˆ˜๋Š” ์„ ํƒ์ ์œผ๋กœ ๊ฐ’์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ ๊ฐ’์ด ์ „๋‹ฌ๋˜์ง€ ์•Š์œผ๋ฉด ๋ณดํ†ต undefined๊ฐ€ ๋œ๋‹ค.)

## ์ฝœ๋ฐฑ ์ง€์˜ฅ ์˜ˆ์‹œ

setTimeout(() => {
    console.log('์ฒซ ๋ฒˆ์งธ ๋น„๋™๊ธฐ ์ž‘์—… ์‹œ์ž‘');
    setTimeout(() => {
        console.log('๋‘ ๋ฒˆ์งธ ๋น„๋™๊ธฐ ์ž‘์—… ์‹œ์ž‘');
        setTimeout(() => {
            console.log('์„ธ ๋ฒˆ์งธ ๋น„๋™๊ธฐ ์ž‘์—… ์‹œ์ž‘');
            // ์ถ”๊ฐ€์ ์ธ ๋น„๋™๊ธฐ ์ž‘์—… ์ˆ˜ํ–‰...
        }, 1000);
    }, 1000);
}, 1000);

์œ„์™€ ๊ฐ™์ด ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋ฉด ์ฝœ๋ฐฑ ์ง€์˜ฅ์ด๋ผ๋Š” ๋งค๋„ˆ๋ฆฌ์ฆ˜์— ๋น ์ง„๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•ž์„œ๋งํ•œ promise๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด๋œ๋‹ค. ์œ„์˜ ์ฝ”๋“œ๋ฅผ promise๋กœ ํ•ด๊ฒฐํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ๋‚˜์˜จ๋‹ค.

function delay(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

delay(1000)
    .then(() => {
        console.log('์ฒซ ๋ฒˆ์งธ ๋น„๋™๊ธฐ ์ž‘์—… ์‹œ์ž‘');
        return delay(1000);
    })
    .then(() => {
        console.log('๋‘ ๋ฒˆ์งธ ๋น„๋™๊ธฐ ์ž‘์—… ์‹œ์ž‘');
        return delay(1000);
    })
    .then(() => {
        console.log('์„ธ ๋ฒˆ์งธ ๋น„๋™๊ธฐ ์ž‘์—… ์‹œ์ž‘');
        // ์ถ”๊ฐ€์ ์ธ ๋น„๋™๊ธฐ ์ž‘์—… ์ˆ˜ํ–‰...
    });
728x90
Comments