コールバックが必ずしも非同期 I/O を意味するわけではないという点で、あなたは正しいです。
EventEmitter の .emit が次のティックではなく、すぐに機能するという意味で、イベントは必ずしも非同期でもありません。
var EventEmitter = require('events').EventEmitter;
var emitter = new EventEmitter();
emitter.on('ev', function(x) {
console.log("received event ", x);
});
console.log("Hello");
emitter.emit('ev', "X");
console.log("World");
結果:
Hello
received event X
World
ただし、コールバックは次の方法で「非同期」にすることができます。
process.nextTick() を使用します。これにより、コールバック内の実際の I/O 操作が非同期になりません。次のティックまで実行を延期するだけです。一部の操作がブロックされると、イベント ループもブロックされます - このティックではなく次のティックで。
function(data, cb) {
process.nextTick(function() { doSomethingWith(data); cb(); })
});
非同期 I/O 操作によってトリガーされることがわかっているイベントから、指定されたコールバック関数を呼び出す
function(data, cb) {
emitter.startIO();
emitter.on('someIOEvent', function(e) {
doSomethingWith(data,e);
cb();
});
});
非同期であることが知られている別のコールバックベースの関数を使用します。ノードコアとノードのモジュールのほとんどの機能はこのようなものです。
function(data, cb) {
otherFunction(data, function(moredata) {
doMoreStuffWith(moredata, data); cb();
});
});