未登录,请登录后再发表信息
最新评论 (0)
播放视频

《网络忍者NodeJS入门》#8 Node事件发射器

Node JS Tutorial for Beginners #8 - The Node Event Emitter

大家好
Yo, whats’s up today guys.
欢迎来到第8节Node.js教程
Welcome to your eighth Node.js tutorial,
本节课程我们会介绍事件模块
and in this video we’re going to take a look at the ‘event’ module.
上节课中 我们创建了一个叫做stuff的自定义模块
Alright then, guys. so in the last tutorial, what we did was, we created a custom module called ‘stuff’.
我们在app.js文件中导入了它 并把它赋予stuff变量 然后使用了它
We required that in in this ‘app.js’ file, and called that variable ‘stuff’,
现在我们再创建一个模块
and then we used it. Now, as well as creating custom modules,
NodeJs也有一些内置的核心模块
Node.js also ships with a bunch of inbuilt core modules,
我们可以在自己的程序中使用
which we can use in our application.
我们可以像导入自定义模块那样导入它们
And we can ‘require’ them in the same way that we would ‘require’ custom modules.
NodeJs中的核心模块之一是事件模块
Ok, now one of those core modules in Node.js is called the ‘events’ module,
这就是我们今天要学习的
and that’s what we’re going to take a look at.
如果我们要导入一个核心模块
So when we are requiring a core module,
我们只需要把模块名称写到这里
what we need to do, is just pop in the module name right here.
不需要模块路径或其他东西 只有模块名称即可
Not the path to the module, or anything like that, just the module name.
因为它是Nodejs内置的核心模块
And because it’s a core module built into Node.js,
node可以把它识别出来
Node will recognise that,
并且把这个模块导入到这里
and it will go out, and it will fetch that module for us.
这个模块叫做events
So this module is called ‘events’
只需要这样写就可以
so that’s all we need to do.
我们最好给这个变量改一下名 比如说events
And we better change to the name of this variable to something like ‘events’ as well.
所以无论这个模块中的module.exports返回什么
So now, whatever is returned on the ‘module.exports’ of this module,
都会保存在events变量中
so going to be stored in this ‘events’ variable now, ok.
在这个模块中 module.exports返回的其中一个属性是
Now, one of the things returned on that ‘module.exports’ property,
是事件发射器eventEmitter
in this module, is the event emitter.
我们可以在NodeJs中使用事件发射器创建自定义事件
And we can use the event emitter in Node.js, to create custom events.
当这些事件被触发时会做出响应
and then react to those events when they are emitted.
如果你用过jQuery的话
So, if you’ve ever used jQwery,
它里面有类似的东西
we have something similar.
我们可以这样写“element.on()”
If I was to write something like this, ‘element.on()’
“click” 然后触发一个函数
‘click’, fire a function,
这是一个事件监听 对吧
ok. This is an event listing, right?
这条语句的意思是 如果这个元素(element)
So we’re saying, ok, well, when this element,
触发了点击(click)事件
fires a ‘click’ event, or emitters a ‘click’ event,
那么我们就想要激发这个回调函数 执行某些操作
then we want to fire this callback function and do something.
就是说我们对一个元素的事件激发做出了响应
Ok, so, we are reacting to an event being emitted on this element.
在NodeJs中我们可以做类似的操作
So we can do a similar thing in Node.js,
我们可以创建自定义元素 而不是使用click这样的事件
we can create our own custom elements, instead of things like ‘click’,
抱歉 是不使用click这样的事件 而创建自定义事件
and those, sorry, we can create events instead of things like ‘click’,
并且这些事件你可以随意设置
and this events can be whatever you want.
我把这些删掉 我们举个简单的例子
So let’s get rid of this, and do a simple example.
事件模块中module.exports返回给我们的是
So, return to us on this ‘module.exports’ to the ‘events’ module,
时间发射器
like I say, is the event emitter.
它是一个构造器
And that is a constructer.
我们需要创建一个新变量
So what we need to do,
我把它叫做myEmitter
and I’m going to call this ‘myEmitter’.
令它等于 new
And I’m going to set this equal to a ‘new’,
然后使用这里的变量
and then I’m going to use this variable right here,
events.EventEmitter
‘events.EventEmitter’.
现在把我们自己的事件发射器对象存储到这
Ok, so now, we’re going to have our own events emitter object stored here.
现在我们可以触发这个事件了
So, now we can wire up events to this.
我们可以这样写 myEmitter
So we can say something like this, we can say, ‘myEmitter’,
.on()
sorry, ‘.on’,
然后创建一个事件
and then create an event,
我们就把它叫做someEvent 它没什么意义
and we’ll just call this event ‘someEvent’, something meaningless, right.
这个事件发生 触发的时候
And then when this event occurs, when it emits,
我们希望能够执行一些操作
then we want to do something,
就是这里的回调函数
And that’s going to be in this callback function, right here.
如果想的话 我们还可以向回调函数中传递参数
And if we want, we can pass through a parameter into this callback function.
我们就假设是mssg
Let’s just say, ‘message’, ok?
这个事件被触发的时候
So when this event occurs,
我们可以在控制台中打印出
what we’re going to do, is log to the console,
这个mssg参数
this ‘message’. Ok.
我们现在来触发这个事件
So now let’s go ahead and emit this event.
可以这样写 myEmitter
So we’ll say, ‘myEmitter’,
然后是.emit
and, we can say, ‘.emit’,
然后选择要触发的事件
and then choose which event to emit,
这里是someEvent
so, ‘someEvent’,
我们也要向回调函数中传入一个参数
and we also pass a parameter through to the callback function.
emit函数中的第一个参数
So the first argument in this emit function,
是我们要触发的事件
is the event we want to emit.
后面的参数是
And then the arguments thereafter,
我们要向这个函数传递的参数
whatever we pass through in to this function.
我们就设置mssg为
So let the message just be,
“the event was emitted”
现在我们输入node app来运行它
and say ‘nodespp’ and run it,
就可以看到控制台输出了“the event was emitted”
因为我们监听了这个事件
通过on(‘someEvent’)来监听它
所以我们在这个对象中监听了这个事件
然后我们手动触发了这个事件
并且把这个字符串传递给这个函数
然后当这个事件被触发的时候
这个回调函数就会被调用 并把mssg输出到控制台
我们来看一个复杂一点的例子
它能更好的展示出事件发射器的强大之处
我把这些东西删掉
为了演示接下来这个例子
我会导入NodeJs的另一个核心模块
这个模块叫做util 它是工具(utility)的简写
它是一个工具模块 我们可以使用它做很多事
我们可以使用util模块完成的一件事是
继承NodeJs内置对象或其他对象
中的特定东西
我们来导入它 你一会就知道我做什么了
就是这样写 “util=require”
“util”
一会我们就会用到它
但是首先我要创建一个新的对象构造器
像这样写 var 然后是Person
令它等于一个函数
它需要一个参数name
函数里面我们要写
“this.name=name”
我们创建一个Person对象的时候 就要传入name参数
我们继续写
使用这个util函数 或者说util模块
我要做的是
继承这个eventEmitter
我想让用它创建的每个Person对象
都继承eventEmitter
我们可以把自定义事件关联到Person
我们这样写“util” 就是这里这个东西
“.inherits”
然后向这个函数传递两个参数
传递的第一个参数是
我们想要继承东西的对象的构造器
即Person 我们想让Person继承一些东西
我们想要继承的东西是
events.eventEmitter
所以我们要继承它
任何使用Person构造器创建的对象
都会和这个自定义的事件关联起来
我们来创建一些Person对象 我要创建3个对象
首先是“var james = new Person”
然后把它的名字传递进去 即“james”
我们还要创建两个对象 我把它复制一下
然后粘贴两次
第二个叫mary
同样把名字传递进去
第三个叫做ryu
同样把名字传递进去
现在我们有3个Person对象 james mary以及ryu
我想做的是用自定义事件来监听给每个对象
首先我要把这3个对象存储在一个数组里
这个数组叫people
让它等于一个数组
第一个元素是james
第二个是mary 第三个是ryu
现在它们都被存储在数组中了
它们都存储在数组中 所以我可以这样写
“people.foreach”
它是javascript的一个方法 会遍历数组中的每个元素
每个元素都可以触发这个回调函数
它会接收Person对象的name或者对象本身作为参数
也就是james mary和ryu
在这个函数里面 我们还要关联
一些事件 或者事件的监听器
我会这样写“person
.on(‘speak’)”
所以我们是把person对象
传递到这个回调函数中 可以是这里的任一个
我们正用这个来监听它 因为我们可以实现这个功能
每个用该构造器创建的对象
继承了eventEmitter
我们现在可以给这些对象关联一些事件
这正是我们在做的事 在遍历数组时 我们会给每个对象关联自定义事件
在关联事件时 我们需要
声明一个回调函数
它需要一个mssg参数
接收他们说的话
我们继续进行
把信息输出到控制台 我们这样写“console.
log(person.name)”
就是这里我们创建对象时传递进去的这个属性
我们要打印出名字 然后再连接上
“ said:” 然后是msgg
当我们触发任一person对象的speak事件时
它就会触发这个回调函数 并传递进参数mssg
这句话就是:何人说了这句话
我们来调用一些事件
比如说 james
.emit() 这是触发事件的方式
然后是speak事件
我们还要传递mssg参数 就是“hey dudes”
就类似这样
保存并运行这个程序
输入node app
我们可以看到“james said:hey dudes”
我们已经关联了这个事件 还记得吗
然后我们在这里触发了这个事件
我们可以在该数组中的任一对象中触发这个事件
我们已经把这些事件 这些监听器和数组关联起来了
我们可以用ryu举例
可以这样写“ryu.emit(‘speak’)”
参数是
“I want a curry”
我们再次运行 看看会发生什么
这次输出了“james said:hey dudes”和“ryu said:I want a curry”
这真的很酷
我们在自己创建的对象上关联了自定义事件
我们把监听器关联到每个对象 然后触发了这些事件
我们实现这些是通过事件模块
事件发射器
以及用util模块在person构造器中
继承EventEmitter
非常棒
如果你有任何问题 都可以在下面自由提问
下次课程见

发表评论

译制信息
视频概述

本节主要介绍了事件模块的基本用法以及util模块的使用。

听录译者

收集自网络

翻译译者

[B]hugue

审核员

审核团1024

视频来源

https://www.youtube.com/watch?v=NtrnaTKqFPQ

相关推荐