我以前从节点上了解到,用事件对象处理的所有内容都会异步执行。
这是不正确的。事件是同步的。添加侦听器时,您只是将回调保存在一个对象中:
this._events[type].push(listener);
发出事件时,您只是在迭代一个数组并调用每个侦听器:
for (i = 0; i < len; i++) listeners[i].apply(this, args);
源代码:https :
//github.com/joyent/node/blob/master/lib/events.js
这是异步执行吗?我认为不!
你是对的。它的异步,如果你调用任何I /
O功能或使用
setImmediate,
nextTick或定时器,否则,它是同步的。异步编写的同步代码不会将其转换为异步代码。
为什么我要完成回调!要在异步n之前输出?
因为当您收到“完成”回调时,您将调用“ cb”:
event.on("done", cb);当
cb返回时,“异步N”循环执行。
如何使用事件发射器编写异步函数?
使用
setImmediate或
process.nextTick。
如果你想推迟“我做我的工作”循环执行,你可以换行
events.emit ("work")与nextTick。
var events = require("events");var event = new events.EventEmitter();event.on("work", function () { for (var i = 0; i <= 10; i++) { console.log("I do my work " + i); } event.emit("done");});var async = function (cb) { event.on("done", cb); process.nextTick (function () { //<----- event.emit("work"); }); //<----- for (var i = 0; i <= 10; i++) { console.log("Async " + i); }}async(function () { console.log("I am done callback!");});这将打印:
Async 0Async 1Async 2Async 3Async 4Async 5Async 6Async 7Async 8Async 9Async 10I do my work 0I do my work 1I do my work 2I do my work 3I do my work 4I do my work 5I do my work 6I do my work 7I do my work 8I do my work 9I do my work 10I am done callback!



