0

私はこの方法でモジュールをリロードしています:

require('./module.js');             // require the module
delete require.cache('/module.js'); // delete module from cache
require('/module.js');              // re-require the module

ただし、モジュールに次のようなものが含まれている場合は問題があります。

setInterval(function(){ 
    console.log('hello!'); 
}, 1000);

モジュールをリロードするたびに新しいsetIntervalものが呼び出されますが、最後のモジュールは閉じられません。

各モジュールの(長い)実行中の関数を知って、再度必要になる前にそれらを停止できるようにする方法はありますか?または、どうすればこれを機能させることができますか?

私はどんなクレイジーなアイデアにもオープンです。

4

3 に答える 3

4

これは単なる推測ですが、ドメイン内でモジュールをロードできる場合があります。

完了したら、domain.dispose()を使用してタイマーをクリアします。

disposeメソッドはドメインを破棄し、ドメインに関連付けられているすべてのIOをクリーンアップするために最善を尽くします。ストリームは中止、終了、クローズ、および/または破棄されます。タイマーがクリアされます。 明示的にバインドされたコールバックは呼び出されなくなりました。この結果として発生するエラーイベントはすべて無視されます。

于 2013-03-25T09:31:38.380 に答える
0

間隔への参照を設定し、次のように停止するためのメソッドを公開するだけです。

var interval = setInterval(function () {
    console.log('hello');
}, 1000);

var clearInt = clearInterval(interval);

参照を削除しているだけなので、イベントにフックできるとは思いません。それがもう存在しない場合は、リロードします。これを行う前に、clearInt関数を呼び出します。

于 2013-03-25T07:35:20.163 に答える
0

IntervalRegistryメインアプリケーションでを 作成できます。

global.IntervalRegistry = {
    intervals : {},
    register  : function(module, id) {
      if (! this.intervals[module])
      {
        this.intervals[module] = [];
      }
      this.intervals[module].push(id);
    },
    clean     : function(module) {
      for (var i in this.intervals[module])
      {
        var id = this.intervals[module][i];
        clearInterval(id);
      }
      delete this.intervals[module];
    }
  };

モジュールでは、そこで作成された間隔を登録します。

// module.js
IntervalRegistry.register(__filename, setInterval(function() {
  console.log('hello!');
}, 1000));

クリーンアップするときは、次のように呼び出します。

var modulename = '/full/path/to/module.js'; // !!! see below
IntervalRegistry.clean(modulename);
delete require.cache[modulename];

モジュールは完全なファイル名でに保存されることに注意してくださいrequire.cache

于 2013-03-25T07:39:52.053 に答える