5

我是 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 中的所有内容都应该异步执行。那么,这里有什么问题呢?

4

3 回答 3

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 个并发请求,则总补偿时间将在 3 秒左右,这意味着它是异步的。您可以使用 ab 工具进行检查,或者如果您对节点进行编程,可能更容易安装http-perf。并运行nperf -c 10 -n 10 http://127.0.0.1:8124

于 2012-12-20T11:54:24.363 回答
0

你需要在一个新进程中运行你的睡眠。有一个模块可以帮助您(https://github.com/cramforce/node-worker),或者您可以查看有关 spawn 的普通 api 文档。

于 2012-12-20T11:37:42.903 回答
-3

var async,
__slice = [].slice;

异步 = 要求(“异步”);

async.setTimeOut = function() {
    var arg, args, 回调, 延迟, runWithTimeOut;
    回调 = 参数 [0],延迟 = 参数 [1],参数 = 参数 [2],参数 = 4 <= 参数长度?__slice.call(参数, 3) : [];
    runWithTimeOut = function() {
        return setTimeout(callback, delay, arg, args);
    };

    返回 async.parallel([runWithTimeOut]);
};

于 2014-01-26T23:18:49.323 回答