2016-08-16 3 views
0

작은 스크립트를 만들어 콜백을 더 잘 이해합니다.콜백 이해

아래의 스크립트에서 예상 한 동작은 다음과 같습니다. "http.get이 실행되고 평균 200ms 걸립니다. for 루프"i "증가분은 평균 2500ms가 걸립니다. 200ms에서 프로세스가 종료되고 스크립트 내가이 더 나은 이해한다면, 내가 콜백을 이해하고 생각하는거야? 왜 내가 모두 인쇄됩니다. 작업을 중지해야한다.

var http = require("http"); 
var starttime = new Date(); 

//Function with Callback 
for (var j =0; j<10; j++){ 
    http.get({host : 'nba.com'}, function(res){ 
     console.log("Time Taken = ", new Date() - starttime, 'ms'); 

     process.exit(); 
    }).on('error', function(er){ 
     console.log('Got Error :', er.message); 
    }) 
} 

//Loop that exceeds callback trigger time 
for(var i=1; i<10000; i++){ 
    console.log(i); 
} 

console.log("Time Taken = ", new Date() - starttime, 'ms'); 
+0

for 루프는 동기식이며 코드는 비동기식입니다. 그것은 for 루프를 통해 get async get 호출을 실행 중이다. on 루프는 on 콜백이 시작되기 전에 종료됩니다. 비동기가 작동하는 방법을 설명하기 위해 인터넷에 많은 문서와 샘플이 있습니다. – bryanmac

+0

감사합니다. bryanmac. 나는 그들을 체크 아웃 할 것이다. 그 구름처럼 분명합니다. – PatrickJames

답변

3

자바 스크립트를 Node.js를에는 단일 스레드 및 I/O 이벤트 사용하여 구동된다 따라서 이벤트의 대기열에있는 HTTP 요청의 완료를 알리는 비동기 콜백은 자바 스크립트의 원래 스레드가 끝날 때까지 실행할 수 없으며 시스템에 다시 제어권을 반환합니다. 그런 다음 이벤트 대기열에서 다음 이벤트를 가져 와서 t의 완료를 처리 할 수 ​​있습니다 그는 http 요청입니다.

이와 같이 HTTP 응답을 처리하기 전에 for 루프가 완료 될 때까지 실행됩니다.

  1. 첫 번째 for 루프가 실행 10 개 HTTP 요청을 보냅니다

    은 다음 단계 프로세스에 의해 단계입니다.

  2. 이러한 http 요청은 비동기 네트워킹을 사용하여 백그라운드에서 실행됩니다. 이들 중 하나가 완료되고 응답이있을 때, http 모듈은 Javascript 이벤트 대기열에 이벤트를 넣을 것이고 다른 활동으로 끝나면 이벤트를 이벤트 대기열에서 가져 오는 JS 해석기의 작업이됩니다.
  3. 두 번째 for 루프가 완료 될 때까지 실행되고 모든 i 값이 콘솔에 출력됩니다.
  4. 스크립트가 완료되었습니다.
  5. JS 해석기는 이벤트 대기열을 검사하여 보류중인 이벤트가 있는지 확인합니다. 이 경우 일부 http 응답 이벤트가 있습니다. JS 인터프리터는 이벤트 대기열에서 가장 오래된 이벤트를 가져 와서 해당 콜백을 호출합니다.
  6. 콜백이 끝나면 다음 이벤트가 이벤트 큐에서 가져오고 프로세스는 이벤트 큐가 비워 질 때까지 계속됩니다.
  7. 콜백 중 하나라도 process.exit()을 호출하면 나머지 콜백을 단락시키고 즉시 프로세스를 종료합니다. 이 다른 대답은 당신을 위해 좀 더 일을 설명 할 수 있도록이 Node.js를에서와 같이이 다른 대답이 브라우저 용으로 작성 동안

는 이벤트 중심, 단일 스레드 개념은 동일합니다 How does JavaScript handle AJAX responses in the background?

+0

감사합니다. Jfiend00. 그것은 그것을 분명히 설명합니다. 네트워크 또는 I/O를 잊어 버린 것은 단일 스레드로 인해 CPU가 동기화되는 동안 비동기입니다. For 루프는 CPU 관련 및 I/O 없음입니다. 말이된다. – PatrickJames