2012-12-20 2 views
5

node.js를 처음 사용하기 때문에 setTimeout을 사용하여 긴 연결을 시뮬레이트하고 비동기 적으로 작동하도록 노력했습니다.node.js에서 비동기 적으로 setTimeout을 사용하는 방법

var http = require('http'); 

http.createServer(function (request, response) { 
    console.log('New request @ ' + request.url); 
    (function (response) { 
     setTimeout(function() { 
      console.log('Time is up'); 
      response.writeHead(200, {"Content-Type": "text/plain"}); 
      response.end('Hello World\n'); 
     }, 3000); 
    })(response); 
}).listen(8124); 

console.log('Server running at http://127.0.0.1:8124/'); 

그러나, 위의 코드는 단 3 초마다 한 요청을 처리 할 수있는 동기 단일 스레드 응용 프로그램처럼 수행합니다.

node.js의 모든 내용이 비동기 적으로 작동해야한다고 생각했습니다. 그럼 여기서 뭐가 문제 야?

답변

8

SetTimeout은 비동기식이므로 중간에 익명 기능이 필요하지 않습니다.

var http = require('http'); 

http.createServer(function (request, response) { 
    console.log('New request @ ' + request.url); 
    setTimeout(function() { 
    console.log('Time is up'); 
    response.writeHead(200, {"Content-Type": "text/plain"}); 
    response.end('Hello World\n'); 
    }, 3000); 
}).listen(8124); 

console.log('Server running at http://127.0.0.1:8124/'); 

당신은 비동기 의미 10 concurent 요청 3 초 주위에있을 것입니다 총 빌려 시간을 생산합니다. ab 도구를 사용하여 확인하거나 노드를 프로그래밍하면 http-perf을 쉽게 설치할 수 있습니다. 실행 nperf -c 10 -n 10 http://127.0.0.1:8124

+0

나는 ab로 테스트를했는데 맞다. setTimeout은 비동기 함수이다. Chrome에서 동시에 여러 탭을 열면 5 초 간격으로 하나씩 끝납니다. – Jack

+0

크롬에서 탭 사이를 빠르게 누르는 것이 충분하지 않다고 생각합니다. :) – balazs

+2

크롬이 동일한 URL을 동시에 요청하지 않습니다. URL에 대안 페이지를 추가하면 (예 : 첫 번째 탭은 http://127.0.0.1:8124/0를 요청하고 두 번째 탭은 http://127.0.0.1:8124/1 등을 요청합니다. 그런 다음 예상대로 작동해야합니다. http://stackoverflow.com/questions/15852011/why-settimeout-blocks-eventloop을 참조하십시오. – Jason

1

새 프로세스에서 수면을 실행해야합니다. 너 (https://github.com/cramforce/node-worker)를 도울 수있는 모듈이 있거나 산란에 관한 정상적인 API 문서를 볼 수있다.

-3

var async,
__slice = []. 슬라이스;

async = require ("async");

async.setTimeOut = 함수() {
        VAR의 인수, 인수, 콜백, 지연 runWithTimeOut;
        callback = arguments [0], 지연 = 인수 [1], arg = 인수 [2], args = 4 < = arguments.length? __slice.call (arguments, 3) : [];
        runWithTimeOut = 함수() {
                복귀의 setTimeout (콜백 지연, 인수, 인수);
       }};

        복귀 async.parallel ([runWithTimeOut]);
};

관련 문제