1

次のプログラムは NodeJS でハングします。理由を知っている人はいますか?

終了 = false;

イベント = 必須 ('イベント');
eventEmitter = 新しいイベント.EventEmitter();
eventEmitter.on('終了', 関数() {
  終了=真;
});
setTimeout(関数() {
  eventEmitter.emit('終了');
}、100);

ながら (!終了) {
  process.nextTick();
}

console.log('終了');
4

3 に答える 3

4

nextTickこれはある種の yield 操作ではなく、次にエンジンが自由に呼び出せるようになったときにコールバックが呼び出されるようにスケジュールするためのものです。whileループの終了条件が満たされないため (そして、そのコードでは決して満たされないため)、「ハング」しています。

于 2012-07-26T13:52:54.160 に答える
2

簡単な答え: Node.JS はシングルスレッドであるためです。

長い答え: JavaScript は、イベントを保持するキューに編成されます。これらのイベントは、発生すると、ジョブが完了するまで停止できません。また、Node.JSシングル スレッドであるため、他のコードを並列に実行することはできません。これが意味することは、このコードは次のとおりです。

while (!ended) {
  process.nextTick();
}

無限ループです。ハンドラはメイン イベント (つまり、あなたが示したコード) がその仕事を終えるまで発火できないのでended、変数は決して変化しません。endそして、それは決してしません。

于 2012-07-26T13:53:29.307 に答える
1

process.nextTick();メイン ループの次のサイクルを呼び出さない、次のサイクルが自動的に来る、.nextTick()メソッドを使用して次のサイクルでコールバック関数を呼び出す、情報: http://nodejs.org/api/process.html#process_process_nexttick_callback

while(!ended)は無限ループであるため、アプリケーションがハングしますended。現在のサイクルが終了しないまで変数は変更されず、while ループによってフラッディングされます。

于 2012-07-26T14:06:55.113 に答える