[Node.js] For문과 비동기 Callback
NodeJS 2012. 11. 20. 17:55
"JS 비동기 이벤트 실행 순서"로 인해 첫 번째 예제의 타이머 이벤트 callback은 for 문이 종료된 후 실행된다.
즉, 이벤트 큐에 쌓인(Event Loop 감지 후) 이벤트 callback들의 실행 시점은 for문 에서 선언된 i 변수가 증감 후 9가 되어 루프를 빠져나온 시점인 것이다.
1. Client-Side 코드 예제
for (var i = 0; i < 10; i++){
this.setTimeout(function(){
console.log(i); // 10
}, 10);
}
// 아래 나머지 예제들은 문법 상 차이만 존재하며, 의미는 동일하다.
// 즉, 타이머 이벤트나 전달되는 callback에 즉시 실행 함수를 랩핑하여 클로저를 발생시켜 위 문제를 해결한다.
for (var i = 0; i < 10; i++){
// 타이머 이벤트에 즉시 실행 함수를 랩핑.
(function(i){
this.setTimeout(function(){
console.log(i); // 0 ~ 9
}, 10);
})(i);
}
for (var i = 0; i < 10; i++){
// 전달되는 타이머 이벤트의 callback에 즉시 실행 함수를 랩핑.
this.setTimeout((function(i){
return function(){
console.log(i); // 0 ~ 9
}
})(i), 10);
}
2. Server-Side Node.js 코드 예제
- Server-Side Javascript인 Node.js도 위 동작 방식과 동일하다.
for (var i = 0; i < 10; i++){
// setTimeout 타이머와 같이 비동기로 동작한다
process.nextTick(function(){
console.log(i); // 10
});
}
for (var i = 0; i < 10; i++){
// 타이머 이벤트에 즉시 실행 함수를 랩핑.
(function(i){
process.nextTick(function(){
console.log(i); // 0 ~ 9
});
})(i);
}
for (var i = 0; i < 10; i++){
global.setTimeout((function(i){
return function(){
console.log(i); // 0 ~ 9
}
})(i), 10);
}
3.결과