用EventEmitter编写异步函数

我是节点的新手,并尝试在节点中使用异步和事件行为优势。我以前从节点上了解到,用事件对象处理的所有内容都会异步执行。

然后我尝试了这个,请考虑以下代码:

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);

event.emit("work");

for (var i = 0; i <= 10; i++) {

console.log("Async " + i);

}

}

async(function () {

console.log("I am done callback!");

});

这是异步执行吗?我认为不!为什么,因为我读了很多这句话:

一个事件被触发了,所以去做点什么,然后当你完成它之后,回来告诉我,但是与此同时,我会做点其他的事情。

就像快餐店的场景。但是上面的代码,当事件工作被触发时,将发生以下顺序:

  1. 进入回调
  2. 通过循环
  3. 输出我做我的工作
  4. 触发完成事件
  5. 输出我完成回调!
  6. 输出异步n

为什么我要完成回调!要在异步n之前输出?为什么这里不像快餐店这样的场景

工作事件被触发,去做你的事情,做完后再回来,同时我将输出Async n

这是我用来了解事件驱动行为和节点中异步的信息。但是现在我很困惑。我知道,javascript在单线程上工作。如何使用事件发射器编写异步函数?但是我认为这是不可能的,因为当我发出一个事件时,它将立即执行处理程序。

回答:

我以前从节点上了解到,用事件对象处理的所有内容都会异步执行。

这是不正确的。事件是同步的。添加侦听器时,您只是将回调保存在一个对象中:

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功能或使用setImmediatenextTick或定时器,否则,它是同步的。异步编写的同步代码不会将其转换为异步代码。

为什么我要完成回调!要在异步n之前输出?

因为当您收到“完成”回调时,您将调用“ cb”:

event.on("done", cb);

cb返回时,“异步N”循环执行。

如何使用事件发射器编写异步函数?

使用setImmediateprocess.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 0

Async 1

Async 2

Async 3

Async 4

Async 5

Async 6

Async 7

Async 8

Async 9

Async 10

I do my work 0

I do my work 1

I do my work 2

I do my work 3

I do my work 4

I do my work 5

I do my work 6

I do my work 7

I do my work 8

I do my work 9

I do my work 10

I am done callback!

以上是 用EventEmitter编写异步函数 的全部内容, 来源链接: utcz.com/qa/417132.html

回到顶部