zer*_*ing 15 javascript asynchronous node.js
我是节点中的新手,并尝试在节点中使用异步和事件行为优势.我曾经从节点理解,处理Event对象的一切,它将是异步执行.
然后我尝试了这个,考虑以下代码:
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!");
});
Run Code Online (Sandbox Code Playgroud)
这是异步执行?在我看来没有!为什么,因为我读了很多这句话:
事件被解雇了,所以去做一些事情,然后当你完成它,回来告诉我,但同时我会做别的事情.
喜欢快餐店的场景.但是上面的代码,当事件工作将被解雇时,将发生以下顺序:
为什么我做完回调!要在Async n之前输出吗?为什么这里不像快餐店的场景一样
工作事件被触发,去你做什么并且当你完成后回来,同时我将输出Async n
这是我习惯了解事件驱动的行为和节点中的异步.但现在我很困惑.我知道,javascript适用于单线程.如何用事件发射器编写异步函数?但我认为是不可能的,因为当我发出一个事件时,它会立即执行处理程序.
Gab*_*mas 22
我曾经从节点理解,处理Event对象的一切,它将是异步执行.
这是不正确的.事件是同步的.添加侦听器时,只需将回调保存在对象中:
this._events[type].push(listener);
Run Code Online (Sandbox Code Playgroud)
当你发出一个事件时,你只是迭代一个数组并调用每个监听器:
for (i = 0; i < len; i++)
listeners[i].apply(this, args);
Run Code Online (Sandbox Code Playgroud)
源代码:https://github.com/joyent/node/blob/master/lib/events.js
这是异步执行?在我看来没有!
你是对的.如果你调用任何I/O函数或使用它setImmediate
,nextTick
或者一个计时器,它是异步的 - 否则,它是同步的.异步写入的同步代码不会将其转换为异步代码.
为什么我做完回调!要在Async n之前输出吗?
因为当您收到"完成"回调时,您会调用"cb":
event.on("done", cb);
Run Code Online (Sandbox Code Playgroud)
当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!");
});
Run Code Online (Sandbox Code Playgroud)
这将打印:
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!
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
10977 次 |
最近记录: |