0

我有这个简单的节点服务器:

var http = require('http');

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
  fun();
}).listen(9999, '127.0.0.1');

function fun () {
  setTimeout(function(){
    fun();
    console.log('fun');
  }, 3000);
}

console.log('Server running at 127.0.0.1:9999');

但是打开 127.0.0.1:9999 “fun” 每 3 秒出现两次,而不是只出现一次。为什么?


解决了:

var http = require('http');

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(9998, '127.0.0.1');

fun();

function fun() {
        setTimeout(function(){
                fun();
                console.log('fun');
        }, 3000);
}

现在“乐趣”每三秒出现一次。

4

3 回答 3

3

因为您每 3 秒调用一次函数“fun”,所以它在 setTimeout 回调中调用自身。

于 2013-10-12T11:23:56.517 回答
3

您最初fun()从您的 http 服务器的回调中调用。也就是说,每次http服务器处理一个http请求时,它都会fun()再次调用。因此,在处理了两个 http 请求后,将会有两个单独的有趣序列进行,您应该每三秒在控制台中看到两次“有趣”。在三个请求之后,您应该每三秒在控制台中看到三次“有趣”。在x次请求之后,您应该每三秒在控制台中看到“有趣” x次。

于 2013-10-12T11:36:26.610 回答
3

谜团解开了。

http.createServer(function (req, res) {
  console.log(req.url);                              //Printing the requested URL
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('ello World\n');
  fun();
}).listen(9999, '127.0.0.1');

当请求进来时,我打印了 URL,结果发现每个人工请求都有两个 HTTP 请求进来。这些是请求的 URL。

/
/favicon.ico

你可以在favicon 这里阅读。因此,两个请求都将计时器设置为 3 秒。这就是为什么你看到它fun被打印了两次。

于 2013-10-12T11:44:06.187 回答