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 を開くと、「楽しい」が 3 秒ごとに 1 回ではなく 2 回表示されます。なんで?


解決済み:

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);
}

"fun" が 3 秒ごとに 1 回表示されるようになりました。

4

3 に答える 3

3

関数「fun」を 3 秒ごとに呼び出しているため、setTimeout コールバック内で自分自身を呼び出しています。

于 2013-10-12T11:23:56.517 に答える
3

最初fun()に、http サーバーのコールバック内から呼び出します。つまり、http サーバーが http 要求を処理するたびに、fun()再度呼び出します。したがって、2 つの http 要求が処理された後、2 つの別個の楽しいシーケンスが進行し、コンソールに 3 秒ごとに 2 回「楽しい」と表示されるはずです。3 回のリクエストの後、3 秒ごとに 3 回、コンソールに「fun」と表示されるはずです。x回のリクエストの後、3 秒ごとにコンソールに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 を印刷したところ、人間のリクエストごとに 2 つの HTTP リクエストが入っていることがわかりました。これらは要求された URL です。

/
/favicon.ico

favicon ここについて読むことができます。したがって、両方の要求でタイマーが 3 秒に設定されます。funそのため、2 回印刷されていることがわかります。

于 2013-10-12T11:44:06.187 に答える