2012-02-09 11 views
0

2つの非同期呼び出しをスタックし、両方が完了したときにコールバックを呼び出す関数を呼び出します。
私は本当に簡単な方法を使用して、完了していない呼び出しを追跡しています

ロック++
lock--

問題は、2つの機能の操作が完了する前にプログラムが終了することです。私はデバッグしていたときにこれが問題であることに気付き、プロセスが終了する前に完了するための時間を与えました。

どうすればこの問題を解決できますか?ノードJS早すぎるプログラムの終了

を(私はまさに私の問題を説明する方法についての損失のビットで午前現時点ではそのように私は質問を明確にすることができますする必要が何でも私に聞いてください)-----スクリプトで編集

なぜ私はそれを実行するとすぐに終了するのですか?私は、私がイベントキューに登録していることを呼び出すことによって、スクリプトは実行し続けるべきだと思いましたか?

var events = require('events'); 
var eventEmitter = new events.EventEmitter(); 

eventEmitter.on('spo',function(){ 
console.log('spo'); 
}); 
+8

いくつかのサンプルコードを投稿しますか? – jergason

+1

https://github.com/caolan/asyncを試してみることができます。同じことをしますか? –

答えて

0

COMING From a Git Hub thread.

は、スクリプトが何を持っていないそれらのハンドル(ソケット、タイマーなど)です。

EventEmitterインスタンスは同期です。つまり、すぐに実行されます。 - この例では、イベントが発生するとスクリプトが実行されます。それ自体が持つEventEmitterは有用ではありませんそれは面白い イベント(ネットワークやファイルシステムからのデータを、 の有効期限が切れるタイマーを発する何かに縛らだとき、それが唯一の 役に立つようになります。このようなことの

考えます等。)。

私は彼らが言っていることは、開いているスクリプトを保持しているノードの外側のハンドルであると思います。

0

問題は、イベントエミッタをセットアップし、ハンドラを「スポーク」イベントにアタッチしてから何もしないことです。したがって、ノード・ランタイムは、何も残っていないと判断し、終了します。これを試してみてください:イベントループが生き続けて何

eventEmitter.on('spo', function() { 
    console.log('OK: got event "spo"'); 
}); 
eventEmitter.emit('spo'); 
+0

コールバックを実行してから終了します。私が理解していたのは、登録されたリスナーがいる限り、イベントループは終了しないということです! http.listen()のように機能するものが必要な場合はどうなりますか?スクリプトを実行し続ける。 – Prospero

+0

setInterval(function(){}、500);それを実行し続けるだろうが、私はそれが必要ではないように感じる。 – Prospero

+0

@ JamesAndino:そうです、 'setInterval()'を使うと、ノードはイベントキューに何かがあるので、将来何かがイベントを出すかもしれないことを知っています。ただし、イベントキューが空の場合は、ただ終了します。私は 'httpServer.listen()'のような関数は、ノードが終了しないようにイベントキューに "永続的な"エントリを追加すると思います。 – maerics

関連する問題