node.js 中 emit() 和 on() 的一个小发现
node 中的 EventEmitter 类提供了监听事件的方法 on(event, listener) 和 触发事件的方法 emit(event, [arg1], [arg2], […])
emit触发信号之后,on监听到事件后程序是如何执行的呢?
var events = require("events");
var eventEmitter = new events.EventEmitter();
var connectHandler = function (){
console.log("data_received");
eventEmitter.emit("data_received");
}
eventEmitter.on("data_received",function(){
console.log("data_receive ---> connection");
eventEmitter.emit("connection");
});
eventEmitter.on("connection",function(){
console.log(" connection ---> test");
eventEmitter.emit("test");
});
eventEmitter.on("test",function(){
console.log("I have listened test");
});
connectHandler();
console.log("end");
上面的代码中有三个 on() 监听事件,其中两个的回调函数内又有新的 emit()。 若按照上面代码的顺序进行执行,console中的结果是
data_received
data_receive ---> connection
connection ---> test
I have listened test
end
但是如果将connectHandler中和 on中的console.log 和 emit调换顺序的话,运行会得到相反的结果:
var events = require("events");
var eventEmitter = new events.EventEmitter();
var connectHandler = function (){
eventEmitter.emit("data_received");
console.log("data_received");
}
eventEmitter.on("data_received",function(){
eventEmitter.emit("connection");
console.log("data_receive ---> connection");
});
eventEmitter.on("connection",function(){
eventEmitter.emit("test");
console.log(" connection ---> test");
});
eventEmitter.on("test",function(){
console.log("I have listened test");
});
connectHandler();
console.log("end");
I have listened test
connection ---> test
data_receive ---> connection
data_received
end
这个结果说明,在emit触发事件之后,会先寻找是否存在对应的事件监听,如果有优先执行其回调函数,执行完毕后才会返回值。
---------------------
作者:勰-CLEXMA
来源:CSDN
原文:https://blog.csdn.net/qq1024407215/article/details/61250705
版权声明:本文为博主原创文章,转载请附上博文链接!
- .NET Core多平台开发体验[2]: Mac OS X
- .NET Core多平台开发体验[1]: Windows
- 如何远程关闭一个ASP.NET Core应用?
- 【深度学习】谷歌deepdream原理及tensorflow实现
- 【深度学习】写诗机器人tensorflow实现
- PyTorch还是TensorFlow?这有一份新手指南
- Leetcode 300. Longest Increasing Subsequence
- Leetcode 299. Bulls and Cows
- Leetcode 297. Serialize and Deserialize Binary Tree
- Leetcode 295. Find Median from Data Stream
- 投入大见效慢,还要做AI?
- Leetcode 292. Nim Game
- Leetcode 290. Word Pattern
- 【深度学习】使用tensorflow实现VGG19网络
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 猿实战21——商品发布之商品数据存储
- Android编程自定义进度条颜色的方法详解
- Android TextView对齐的两种方法
- Android ScrollView实现反弹效果的实例
- Ubuntu 18.04上安装 phpMyAdmin的详细教程
- Android Popupwindow弹出窗口的简单使用方法
- 解决CentOS7虚拟机无法上网并设置CentOS7虚拟机使用静态IP上网
- Android编程实现自定义Dialog的大小自动控制方法示例
- Linux中如何查看文件的创建时间详解
- Android 图片添加水印的实现方法
- Linux系统清除缓存的方法总结
- 详解Android使用@hide的API的方法
- Android 实现按两次返回键退出程序(两种方法)
- 使用 bash 倒计时日期的方法
- Android 实现页面跳转