0

TCPサーバーで呼び出そうとしてclose()nodeJSますが、発生しないようです。これが私のコードです

var net = require('net');

var server = net.createServer(function(){console.log("SERVER CREATED")});

server.listen(4000,function(){console.log("SERVER LISTENING")});

setTimeout(function () {
            console.log(">>> CLOSING ");
            server.close(function () {console.log("CLOSED!!")});
        }, 2000);


setTimeout(function () {
            console.log(">>> TEST TIMED OUT!!! ");
            process.exit(1);
        }, 2000);

サーバーがコールバック関数を呼び出すのに十分な時間を確保するために、タイマーを使用しました。その奇妙ですが、私が得る唯一の出力は

SERVER LISTENING
>>> CLOSING 
>>> TEST TIMED OUT!!! 

なぜ何かアイデアはありますか?closeが呼び出されましたが、どういうわけか何も出力されませんでしたか?

4

1 に答える 1

2

私はあなたのコードを実行しましたが、それは完全に理にかなっています。プロセスの終了時にタイムアウトを増やすと、期待どおりに機能します。

ノードはシングル スレッドであるため、一度に 1 つのことしか実行されません。また、リンクされたイベントが発生する順序でコールバックを呼び出します。

順序を説明しやすくするために、テストを書き直しました。

var net = require('net'),
    serverCreated = function(){console.log("SERVER CREATED")},
    serverListening = function(){console.log("SERVER LISTENING")},
    serverClosing = function () {
      console.log(">>> CLOSING ");
      server.close(serverClosed)
    },
    serverClosed = function () {console.log("CLOSED!!")},
    processExit = function () {
      console.log(">>> TEST TIMED OUT!!! ");
      process.exit(1);
    },
    server = net.createServer(serverCreated);

server.listen(4000,serverListening);

setTimeout(serverClosing, 2000);

setTimeout(processExit, 2000);

したがって、実行の順序は次のとおりです。

  1. すべての変数の作成
  2. server.listen(4000,serverListening);
  3. ノードは、serverListening をコールバック キューに追加します
  4. setTimeout(serverClosing, 2000);
  5. ノードは serverClosing をコールバック キューに追加します
  6. setTimeout(processExit、2000);
  7. node は processExit をコールバック キューに追加します
  8. 2 秒: ノードが serverClosing を呼び出す
  9. 2 秒: ノードが processExit を呼び出します
  10. プロセスが存在し、実行が停止します。

ステップ 6 に 4ms を追加すると、6 以降の順序は次のようになります。

  1. node は processExit をコールバック キューに追加します
  2. 2 秒: ノードが serverClosing を呼び出す
  3. サーバー閉鎖
  4. 2.004 秒: ノードが processExit を呼び出す
  5. プロセスが存在し、実行が停止します。

私のマシンでは 4 ミリ秒を追加する必要がありますが、他のマシンでは多かれ少なかれ増減する可能性があります。ServerClosing にかかる時間によって異なります。

注:proces.exit を呼び出す必要はありません。実行するコールバックまたはコードがなくなると、ノードは終了します。これをテストするには、私の例から最後の行を削除してください。

于 2012-12-16T11:07:07.803 に答える