๐Ÿ“ŒLanguage/JavaScript

TIL) ๋น„๋™๊ธฐ, callback, promise, async/await ์ฝ”๋“œ๋กœ ๊ณต๋ถ€ํ•˜๊ธฐ

hellohailie 2022. 5. 29. 18:00

 

๋™๊ธฐํ™”

์ฝ”๋“œ์ž ์งœ์—ฌ์ง„ ์ˆœ์„œ๋Œ€๋กœ ๊ฒฐ๊ณผ๊ฐ’์ด ๋„์ถœ๋œ๋‹ค.  

function waitSyns(ms) {
	var start = Date.now();
    var now = start;
    while(now - start < ms ) {
    	now = Date.now();
    }
} // ํ˜„์žฌ ์‹œ๊ฐ๊ณผ ์‹œ์ž‘ ์‹œ๊ฐ์„ ๋น„๊ตํ•˜๋ฉฐ ms ๋ฒ”์œ„ ๋‚ด์—์„œ ๋ฌดํ•œ ๋ฃจํ”„๋ฅผ ๋„๋Š” blocking ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. 

function drink(person, coffee) {
	console.log(person + '๋Š” ' + coffee + '๋ฅผ ๋งˆ์‹ญ๋‹ˆ๋‹ค');
}
function orderCoffeeSync(coffee) {
	console.log(coffee + '๊ฐ€ ์ ‘์ˆ˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค');
    waitSyns(4000);
    return coffee;
}
let customers = [{
	name: 'Steve',
    request: '์นดํŽ˜๋ผ๋–ผ'
}, {
	name: 'John',
    request: '์•„๋ฉ”๋ฆฌ์นด๋…ธ'
}];
// call synchronously
customers.forEach(function(customer) {
	let coffee = orderCoffeeSync(customer.request);
    drink(customer.name, coffee);
});

// ์ถœ๋ ฅ๊ฐ’: 
์นดํŽ˜๋ผ๋–ผ๊ฐ€ ์ ‘์ˆ˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค
Steve๋Š” ์นดํŽ˜๋ผ๋–ผ๋ฅผ ๋งˆ์‹ญ๋‹ˆ๋‹ค
์•„๋ฉ”๋ฆฌ์นด๋…ธ๊ฐ€ ์ ‘์ˆ˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค
John๋Š” ์•„๋ฉ”๋ฆฌ์นด๋…ธ๋ฅผ ๋งˆ์‹ญ๋‹ˆ๋‹ค

 

 

๋น„๋™๊ธฐ – ๋™์‹œ์— ์—ฌ๋Ÿฌ ์ž‘์—…์„ ํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค!

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

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

 

 

๋น„๋™๊ธฐ์˜ ์ฃผ์š” ์‚ฌ๋ก€

  • DOM Element์˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ
    • ๋งˆ์šฐ์Šค, ํ‚ค๋ณด๋“œ ์ž…๋ ฅ (click, keydown ๋“ฑ)
    • ํŽ˜์ด์ง€ ๋กœ๋”ฉ (DOMContentLoaded ๋“ฑ)
  • ํƒ€์ด๋จธ
    • ํƒ€์ด๋จธ API (setTimeout ๋“ฑ)*
    • ์• ๋‹ˆ๋ฉ”์ด์…˜ API (requestAnimationFrame)*
  • ์„œ๋ฒ„์— ์ž์› ์š”์ฒญ ๋ฐ ์‘๋‹ต
    • fetch API*
    • AJAX (XHR)*

*๋” ๊ณต๋ถ€ํ•˜๊ธฐ

https://developer.mozilla.org/ko/docs/Web/JavaScript/EventLoop

 

function waitAsync(callback, ms) {
	setTimeout(callback, ms);
}
function drink(person, coffee) {
	console.log(person + '๋Š” ' + coffee + '๋ฅผ ๋งˆ์‹ญ๋‹ˆ๋‹ค');
}
let customers = [{
	name: 'Steve',
    request: '์นดํŽ˜๋ผ๋–ผ'
}, {
	name: 'John',
    request: '์•„๋ฉ”๋ฆฌ์นด๋…ธ'
}];
function orderCoffeeAsync(menu, callback) {
	console.log(menu + '๊ฐ€ ์ ‘์ˆ˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค');
    waitAsync(function() {
    	callback(menu);
    }, 4000);
}
// call asynchronously
customers.forEach(function(customer) {
	orderCoffeeAsync(customer.request, function(coffee) {
    	drink(customer.name, coffee);
    });
});

//์ถœ๋ ฅ๊ฐ’
์นดํŽ˜๋ผ๋–ผ๊ฐ€ ์ ‘์ˆ˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค
์•„๋ฉ”๋ฆฌ์นด๋…ธ๊ฐ€ ์ ‘์ˆ˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค

Steve๋Š” ์นดํŽ˜๋ผ๋–ผ๋ฅผ ๋งˆ์‹ญ๋‹ˆ๋‹ค
John๋Š” ์•„๋ฉ”๋ฆฌ์นด๋…ธ๋ฅผ ๋งˆ์‹ญ๋‹ˆ๋‹ค

setTimeout

 

setTimeout ํ•จ์ˆ˜์˜ ์ฒซ๋ฒˆ์งธ ์ธ์ž๋Š” ๊ธฐ๋‹ค๋ฆฐ ํ›„์— ์‹คํ–‰์‹œํ‚ฌ ํ•จ์ˆ˜, ๊ทธ ๋‹ค์Œ์€ ๊ธฐ๋‹ค๋ฆด ๋ฐ€๋ฆฌ์ดˆ(delay) ์ด๋‹ค. 

 

 

ํ•˜์ง€๋งŒ setTimeout์˜ delay์ธ์ž๊ฐ€ delay ms ํ›„์— ์‹คํ–‰ ๋˜๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ •ํ™•ํžˆ๋Š” delay ms ํ›„์— Callback Queue์— ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•œ๋‹ค.

 

 


๋”๋ณด๊ธฐ

๋น„๋™๊ธฐ ํ•จ์ˆ˜ ์ „๋‹ฌ ํŒจํ„ด

๋น„๋™๊ธฐ ํ•จ์ˆ˜ ์ „๋‹ฌ ํŒจํ„ด 1 : callback ํŒจํ„ด

let request = 'caffelatte';
orderCoffeeAsync(request, function(response) {
	// response -> ์ฃผ๋ฌธํ•œ ์ปคํ”ผ ๊ฒฐ๊ณผ
   	drink(response);
});

 

๋น„๋™๊ธฐ ํ•จ์ˆ˜ ์ „๋‹ฌ ํŒจํ„ด 2 : ์ด๋ฒคํŠธ ๋“ฑ๋ก ํŒจํ„ด // ์ด๋ฒคํŠธ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํŒจํ„ด์ด๋ผ๋ฉด!

let request = 'caffelatte';
orderCoffeeAsync(request).onready = function(response) {
	// response -> ์ฃผ๋ฌธํ•œ ์ปคํ”ผ ๊ฒฐ๊ณผ
    drink(response);
};

 

 


Callback = ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ์ˆœ์„œ๋ฅผ ์ œ์–ดํ•˜๊ณ  ์‹ถ์„๋•Œ

const printString = (string) => {
    setTimeout(
        () => {
            console.log(string)
        },
        Math.floor(Math.random() * 100) + 1
    )
}

const printAll = () => {
    printString("a")
    printString("b")
    printString("c")
}
printAll() 

// ์ถœ๋ ฅ๊ฐ’
a
c
b
๋žœ๋ค์œผ๋กœ ๋‚˜์˜จ๋‹ค.

 

const printString = (string, callback) => {
    setTimeout(
        () => {
            console.log(string)
            callback()
        },
        Math.floor(Math.random() * 100) + 1
    )
}

const printAll = () => {
    printString("a", () => {
    	printString("b", () => {
        	printString("c", () => {}) // ์ฝœ๋ฐฑํ—ฌ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. 
        })
    })
}
printAll() 

// ์ถœ๋ ฅ๊ฐ’ 
a
b
c

์–ธ์ œ๋‚˜ a ,b, c ์ˆœ์„œ๋Œ€๋กœ ๋‚˜์˜จ๋‹ค. 
๊ทธ ์ด์œ ๋Š” printString ๋ช…์˜ ํ•จ์ˆ˜์—์„œ callback์ด setTimeout ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๋Š” setTimeout์˜ ์ฝœ๋ฐฑ์— ์ด callback์„ ์‹คํ–‰ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 


callback error handling design & usage

const somethingGonnaHappen = callback => {
	waitingUnitlSomethingHappens()
    
    if(isSomethingGood) {
    	callback(null, something)
    }
    if(isSomethingBad) {
    	callback(something, null)
    }
}

somethingGonnaHappen((err, data) => {
	if(err) {
    	console.log('ERR!!');
        return;
    }
    return data;
})

 

 


Promise = ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉ๋˜๋Š” ๊ฐ์ฒด

callback์„ ์ธ์ž๋กœ ๋ฐ›์ง€ ์•Š๊ณ , ์ƒˆ๋กœ์šด Promise๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. 

์ด Promise๋Š” resolve์™€ reject๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š” callback์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค. 

 

ES6/ES2015 ์—์„œ ์†Œ๊ฐœ๋œ Job Queue๋Š” Callback Queue์™€ ๋‹ค๋ฅธ Queue์ด๋ฉฐ Promise๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ Job Queue๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. promise๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ callback ํ•จ์ˆ˜ ์—ญํ• ์„ ํ•˜๋Š” .then ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉฐ, ์ด๋Ÿฐ thenableํ•œ ํ•จ์ˆ˜๋“ค์€ Job Queue์— ์ถ”๊ฐ€๋œ๋‹ค.

 

Job Queue์˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ Callback Queue๋ณด๋‹ค ๋†’์•„์„œ, Event Loop๋Š” Call Stack์ด ๋น„์–ด์žˆ์„ ๊ฒฝ์šฐ, Job Queue์—์„œ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ชจ๋“  ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ณ  Callback Queue๋กœ ์ด๋™ํ•˜๊ฒŒ ๋œ๋‹ค.

const printString = (string) => {
	return new Promise((resolve, reject) => {
    	setTimeout(
        	() => {
            console.log(string)
            resolve()
            },
            Math.floor(Math.random() * 100) + 1
            )
        })
    }
    
    const printAll = () => {
    	printString('A')
        .then(() => {
        	return printString("B")
        })
        .then(() => {
        	return printString("C")
        })
    }

printAll()

// ์ถœ๋ ฅ๊ฐ’
A
B
C

 

Promise ๋Š” ์ฒซ ์ž„๋ฌด๊ฐ€ ๋๋‚˜๊ณ  .then์œผ๋กœ ๋‹ค์Œ ์ž„๋ฌด๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. 

reject๋กœ ์—๋Ÿฌ์ฒ˜๋ฆฌ๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” .catch๋ฅผ ์ด์šฉํ•ด์„œ ์—๋Ÿฌ ํ•ธ๋“ค๋ง์„ ๋งˆ์ง€๋ง‰ ์ฒด์ธ์—์„œ ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

๋งŒ์•ฝ callback์—์„œ ์—๋Ÿฌ๋ฅผ ๋„˜๊ฒจ์ฃผ๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ์—ˆ๋‹ค๋ฉด ์ฝœ๋ฐฑ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ๋งˆ๋‹ค ์—๋Ÿฌ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผํ•œ๋‹ค. 

 

 


Promise Hell

function gotoCodestates() {
	return new Promise((resolve, reject) => {
    	setTimeout(() => {resolve(`1. go to codestates`)}, 100)
    })
}
function sitAndCode() {
	return new Promise((resolve, reject) => {
    	setTimeout(() => {resolve(`2. sit and code`)}, 100)
    })
}
function eatLunch() {
	return new Promise((resolve, reject) => {
    	setTimeout(() => {resolve(`3. eat lunch`)}, 100)
    })
}
function gotoBed() {
	return new Promise((resolve, reject) => {
    	setTimeout(() => {resolve(`4. gotoBed`)}, 100)
    })
}

gotoCodestates()
.then(data => {
	console.log(data)
    
    sitAndCode()
    .then(data => {
    	console.log(data)
    
    	eatLunch()
        .then(data => {
        	console.log(data)
            
            gotoBed()
            .then(data => {
            	console.log(data)
            })
        })
    })
})

// ์ถœ๋ ฅ๊ฐ’
1. go to codestates
2. sit and code
3. eat lunch
4. gotoBed

 

 


Promise Chaining

return์„ ํ†ตํ•ด์„œ ํ•ด๋‹น ๋น„๋™๊ธฐ๋ฅผ ๋‹ค์‹œ ๋‹ค์Œ์œผ๋กœ ๋„˜๊ธด๋‹ค. 

promise์˜ ๊น”๋”ํ•จ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ณ , ์ฝœ๋ฐฑ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค. 

function gotoCodestates() {
	return new Promise((resolve, reject) => {
    	setTimeout(() => {resolve(`1. go to codestates`)}, 100)
    })
}
function sitAndCode() {
	return new Promise((resolve, reject) => {
    	setTimeout(() => {resolve(`2. sit and code`)}, 100)
    })
}
function eatLunch() {
	return new Promise((resolve, reject) => {
    	setTimeout(() => {resolve(`3. eat lunch`)}, 100)
    })
}
function gotoBed() {
	return new Promise((resolve, reject) => {
    	setTimeout(() => {resolve(`4. gotoBed`)}, 100)
    })
}

gotoCodestates()
.then(data => {
	console.log(data)
    return sitAndCode()
})
.then(data => {
	console.log(data)
    return eatLunch()
})
.then(data => {
	console.log(data)
    return gotoBed()
})
.then(data => {
	console.log(data)
})

// ์ถœ๋ ฅ๊ฐ’
1. go to codestates
2. sit and code
3. eat lunch
4. gotoBed

 


async await

 

await๋ผ๋Š” ๊ฒƒ์œผ๋กœ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋“ค์„ ๋งˆ์น˜ ๋™๊ธฐ์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ์“ธ ์ˆ˜ ์žˆ๋‹ค. 

์‹ค์ œ๋กœ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ์€ promise์™€ ๋™์ผํ•˜๊ฒŒ ๋Œ์•„๊ฐ€๋Š”๋ฐ ํ‘œํ˜„์ž์ฒด๋ฅผ ๋™๊ธฐ์ ์„ ์“ธ ์ˆ˜ ์žˆ๋‹ค. ํ‘œํ˜„ ๊ฐ€๋…์„ฑ์ด ์ข‹๋‹ค.

์ˆœ์ฐจ์ ์œผ๋กœ ๋Œ์•„๊ฐ„๋‹ค. ๊ธฐ๋‹ค๋ฆฐ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. 

 

 

function gotoCodestates() {
	return new Promise((resolve, reject) => {
    	setTimeout(() => {resolve(`1. go to codestates`)}, 100)
    })
}
function sitAndCode() {
	return new Promise((resolve, reject) => {
    	setTimeout(() => {resolve(`2. sit and code`)}, 100)
    })
}
function eatLunch() {
	return new Promise((resolve, reject) => {
    	setTimeout(() => {resolve(`3. eat lunch`)}, 100)
    })
}
function gotoBed() {
	return new Promise((resolve, reject) => {
    	setTimeout(() => {resolve(`4. gotoBed`)}, 100)
    })
}

const result = async () => {
	const one = await gotoCodestates();
    console.log(one);
    
    const two = await sitAndCode();
    console.log(two);
    
    const three = await eatLunch();
    console.log(three);
    
    const four = await gotoBed();
    console.log(four);
};

result();

// ์ถœ๋ ฅ๊ฐ’
1. go to codestates
2. sit and code
3. eat lunch
4. gotoBed

 

 

 


์ •๋ฆฌ

 

1. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์™œ ๋น„๋™๊ธฐ๋กœ ๋Œ์•„๊ฐ€์•ผํ• ๊นŒ? 

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

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

 

2. callback = ๋น„๋™๊ธฐ๋กœ ๋Œ์•„๊ฐ€๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ œ์–ดํ•˜๋Š” ๋ฐฉ๋ฒ• 

3. promise = ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ค์šด callback์„ ๋Œ€์‹ ํ•˜์—ฌ ์‰ฝ๊ณ  ํŽธํ•˜๊ฒŒ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. 

4. promise๋„ promise hell์— ๋น ์งˆ ์ˆ˜ ์žˆ๊ธฐ์— promise chaining์„ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค. 

5. async await๋ฅผ ์จ์„œ promise๋ฅผ ์ผ๋ฐ˜ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. 

 

 

๊ฐ„๋‹จํ•œ ์ด๋ฒคํŠธ ๋ฃจํ”„์˜ ์ž‘๋™ ์›๋ฆฌ

 

์ด๊ฒƒ์€ ์Šคํƒ์ด ๋น„์–ด์žˆ์„๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค. 

setTimeout 0์ด ์‹คํ–‰๋˜๋ฉด Web API๋Š” ๋ฐ”๋กœ ์ข…๋ฃŒํ•˜๊ณ  ํ์— ์ฝœ๋ฐฑ์„ ์ง‘์–ด๋„ฃ๋Š”๋‹ค. ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ์Šคํƒ์ด ๋น„์›Œ์งˆ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ํ›„์— ํ์— ์žˆ๋Š” ์ฝœ๋ฐฑ์„ ์Šคํƒ์— ์Œ“์„ ์ˆ˜ ์žˆ๋‹ค. ์Šคํƒ์€ ๊ณ„์†ํ•ด์„œ ์‹คํ–‰์„ ํ•œ๋‹ค. console.log('hailie')๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์Šคํƒ์ด ์ •๋ฆฌ๊ฐ€ ๋œ๋‹ค. ์ด์ œ ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ๊ฐœ์ž…ํ•ด์„œ ์ฝœ๋ฐฑ์„ ํ˜ธ์ถœํ•œ๋‹ค. ์ด๊ฒƒ์ด setTimeout 0์ด ์ด ์ฝ”๋“œ ์‹คํ–‰์„ ์–ด๋–ค ์ด์œ ์—์„ ๊ฐ€ ์Šคํƒ์— ๋งˆ์ง€๋ง‰๊นŒ์ง€ ์ง€์—ฐ์‹œํ‚ค๋Š” ์ด์œ ์ด๋‹ค. ์ •ํ™•ํžˆ๋Š” ์Šคํƒ์ด ๋น„์›Œ์งˆ๋•Œ๊นŒ์ง€๊ฒ ์ง€.

์ฝœ๋ฐฑ์€ ๋‹ค๋ฅธ ํ•จ์ˆ˜๊ฐ€ ๋ถ€๋ฅด๋Š” ํ•จ์ˆ˜์ด๋‹ค. ํ˜น์€ ์•ž์œผ๋กœ ํ์— ์Œ“์ผ ๋น„๋™๊ธฐ์‹ ์ฝœ๋ฐฑ์ด๋ผ๊ณ  ๋ฌ˜์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

์ฐธ์กฐ "event loop"

https://www.youtube.com/watch?v=8aGhZQkoFbQ

 

์ฐธ์กฐ *call stack*

https://medium.com/sjk5766/call-stack%EA%B3%BC-execution-context-%EB%A5%BC-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90-3c877072db79

 

์ฐธ์กฐ"js๋น„๋™๊ธฐ"

https://joshua1988.github.io/web-development/javascript/javascript-asynchronous-operation/