13

検討:

node -e "setTimeout(function() {console.log('abc'); }, 2000);"

これは実際には、プログラムが終了する前にタイムアウトが発生するのを待ちます。

これは、ノードが終了する前にすべてのタイムアウトが完了するのを待つことを意図していることを意味するかどうか、基本的に疑問に思っています。

これが私の状況です。私のクライアントには、ショートカット アイコンを使用して Windows から実行する node.js サーバーがあります。ノード アプリが例外的な状況に遭遇した場合、通常は即座に終了し、コンソールでエラーの内容を確認するのに十分な時間が残されません。これは悪いことです。

私のアプローチは、プログラム全体を try catch でラップすることです。したがって、次のようになります: try { (function () { ... })(); } catch (e) { console.log("EXCEPTION CAUGHT:", e); }、しかしもちろん、これによりプログラムがすぐに終了することにもなります。

したがって、この時点で、終了する前に、ユーザーが例外のプレビューまたはスクリーンショットを取得できるように、約 10 秒残しておきます。

npm モジュールを介してブロッキングを使用するだけでよいと思いsleep()ますが、テストでタイムアウトの設定も機能しているように見えることがわかりました。(つまり、組み込みの何かが機能する場合、なぜモジュールを気にするのですか?)これの重要性は大きくないと思いますが、そのノードが終了する前にすべてのタイムアウトが完了するのを実際に待機する場所に指定されているかどうかに興味があります。こうすることで安心できます。

4

6 に答える 6

10

通常、ノードはすべてのタイムアウトが発生するのを待ってから、正常に終了します。呼び出しprocess.exit()はタイムアウト前に終了します。

詳細はlibuvの一部ですが、ドキュメントはそれについて漠然としたコメントをしています:

http://nodejs.org/api/all.html#all_ref

ref() を呼び出して、プログラムを開いたままにするタイマーを明示的に要求できます

すべての事実をまとめるとsetTimeout、デフォルトでは、イベント ループを開いたままにするように設計されています (そのため、保留中の唯一のものである場合、プログラムは待機します)。この動作をプログラムで無効にしたり、再度有効にしたりできます。

于 2013-08-05T03:50:06.797 に答える
1

簡単な方法 解決策:

  • nodejsを起動するバッチ(.bat)ファイルを作る
  • そこからショートカットを作る

なぜこれがベストなのか。このようにして、クライアントはコマンドラインで nodejs を実行します。また、nodejs プログラムが返されたとしても、コマンド ラインには何も起こりません。

バットファイルの作成:

  1. テキストファイルを作る
  2. 置くSTART cmd.exe /k "node abc.js"
  3. それを保存
  4. 名前を abc.bat に変更します
  5. ショートカットなどを作ってください。
  6. それを開くと、CommandLine が開き、nodejs ファイルが実行されます。

これに settimeout を使用するのは悪い考えです。

于 2013-08-05T03:44:24.010 に答える
1

setTimeoutノードがすべての呼び出しまたは呼び出しが完了するのを待たなかった場合setInterval、単純なスクリプトでそれらを使用することはできません。

またはいくつかの非同期 I/O 呼び出しのように、ノードにイベントをリッスンするように指示するとsetTimeout、イベント ループは終了するように指示されるまでループします。

すべてをラップするのではなくtry/catch、イベント リスナーをバインドして、ドキュメントの例のように処理できます。

process.on('uncaughtException', function(err) {
  console.log('Caught exception: ' + err);
});

setTimeout(function() {
  console.log('This will still run.');
}, 500);

// Intentionally cause an exception, but don't catch it.
nonexistentFunc();
console.log('This will not run.');

イベントでは、 10 秒後に終了uncaughtExceptionする a を追加できます。setTimeout

process.on('uncaughtException', function(err) {
  console.log('Caught exception: ' + err);
  setTimeout(function(){ process.exit(1); }, 10000);
});

この例外が回復可能なものである場合は、次のドメインを参照してください: http://nodejs.org/api/domain.html

編集:

実際には、別の問題が発生している可能性があります。クライアント アプリケーションが十分な (またはまったく) ロギングを行っていないということです。log4js-nodeを使用して、一時ファイルまたはアプリケーション固有の場所に書き込むことができます。

于 2013-08-05T03:52:47.687 に答える
0

ノードはタイマーを覚えていますが、追跡できる場合に限られます。少なくともそれは私の経験です。

アロー/匿名関数で使用する場合は、次setTimeoutのようにタイマーを配列で追跡することをお勧めします。

=> {
  timers.push(setTimeout(doThisLater, 2000));
}

let timers = [];そして、消えるメソッド、つまりグローバルに設定されていないことを確認してください。

于 2016-07-03T17:31:00.430 に答える
0

奇妙なのはprocess.exit()、Jim Schubert が指摘したように、呼び出したとき、またはキャッチされていない例外があるときです。それ以外の場合、ノードはタイムアウトが完了するまで待機します。

于 2013-08-05T05:54:39.130 に答える