[Node.js] For문과 비동기 Callback




"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.결과