如何在node.js中异步使用setTimeout

时间:2012-12-20 11:31:49

标签: node.js

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

3 个答案:

答案 0 :(得分: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请求,则总comp时间约为3秒,这意味着它是异步的。您可以使用ab工具进行检查,或者如果您编写节点,可能更容易安装http-perf。并运行nperf -c 10 -n 10 http://127.0.0.1:8124

答案 1 :(得分:1)

你需要在一个新的过程中睡觉。有一个模块可以帮助你(https://github.com/cramforce/node-worker),或者你可以查看关于spawn的正常api文档。

答案 2 :(得分:-3)

var async,
__slice = [] .slice;

async = require(“async”);

async.setTimeOut = function(){
var arg,args,callback,delay,runWithTimeOut;
callback = arguments [0],delay = arguments [1],arg = arguments [2],args = 4< = arguments.length? __slice.call(arguments,3):[];
runWithTimeOut = function(){
return setTimeout(callback,delay,arg,args);
};

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