事件循环
标准范例
// 创建事件处理程序
var connectHandler = function connected() {
console.log('连接成功。');
// 触发 data_received 事件
eventEmitter.emit('data_received');
}
也可以写成,只不过是让connectHandler
代替了函数
function connected() {
console.log('连接成功。');
// 触发 data_received 事件
eventEmitter.emit('data_received');
}
进而可以写成
function connected() {
console.log('连接成功。');
eventEmitter.emit('data_received');
}
eventEmitter.on('connection', connected);
自己的理解:我修改的和自己的理解,用当前的储备知识去理解新的知识,也是一种好的选择
使用 Python 逻辑去理解 Nodejs
// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();
eventEmitter.on('connection', function connected() {
console.log('连接成功。');
eventEmitter.emit('data_received');
});
eventEmitter.on('data_received', function(){ // 触发 data_received 事件时,执行匿名函数,为什么匿名函数,因为只用一次
console.log('数据接收成功。');
});
// 执行 connection 事件
eventEmitter.emit('connection');
程序最先触发 eventEmitter.emit('connection');
上面的两个 eventEmitter.on
是不执行的,其实也就相当于是Python里面的 def
要使用 eventEmitter
这个函数,就必须 impport一个相关的「库」
也即是var events = require('events');
之后定义函数 connection
的作用是触发eventEmitter.emit('data_received');
这个函数
data_received
函数我们又定义的功能是console.log(‘数据接收成功。’);
下面使用Python写一下这个相同的逻辑
由此可见,相同的代码量,相同的返回逻辑,Python在底层给我们做的工作有多少。Python的代码甚至可以在 6 行内就完成,而不需要引入任何库文件,相比 js 需要引入 events
模块下面还需要书写eventEmitter.on 和 eventEmitter.emit逻辑。Python真的就是和写英语作文一样。
def connection():
print("连接成功")
data_received()
def data_received():
print("数据接收成功")
connection()
在js的官方解释中,eventEmitter对象中on被解释为监听
,Python并不关注底层交互逻辑,就只是告诉你如果你调用connection()
函数,那么def connection()
下面的所有内容都会被执行。
而在nodejs里面,函数触发和函数定义分别被写成了 emit 和 on,emit
则就表示我们需要运行这个函数。on 就是这里官方所说的事件监听器。事件监听器的概念至关重要,它定义了在特定事件发生时应当执行的代码。那么Python 里面的 def 又何尝不是一种事件监听器或者说函数触发器呢。
在gpt4给出的答案中,无论def还是事件监听器其实本质上都是我们在封装这个函数,我认为在这里,写的多的也就很自然而然的去理解了这里面的小窍门,和学习自然语言是一样的道理。我个人因为脚本写的比较多,Python也是最常用的,闭着眼睛就是defXXX,就和在英语中,我们闭着眼睛都能说出:what are you doing,而不去做翻译或者考虑其中的语法,说道理还是熟能生巧,用的很多,超级多次已经深深打印在了脑子上了,又怎么不会理解呢。
gpt4的观念和对我的理解的评价
- 你的理解是有道理的。将 Python 逻辑应用于理解 Node.js 中的事件循环和事件处理是一种有效的学习方法。你提到的一些关键点值得进一步讨论:
- 事件驱动编程: Node.js 强调的是事件驱动编程模式。在这个模式中,事件监听器(使用
.on
方法注册)等待某个特定事件的发生,并在事件发生时执行相应的回调函数。这种模式在处理异步操作、尤其是I/O操作时非常有用。 - 回调函数: 你提到的
eventEmitter.on
和eventEmitter.emit
是 Node.js 中处理事件的基础。其中emit
用于触发事件,而on
用于定义当特定事件发生时应执行的回调函数。 - Python 中的简洁性: 正如你所指出的,Python 通常不需要像 Node.js 那样明确的事件监听和触发机制。Python 的函数调用更直接、更简洁。这是因为 Python 和 Node.js 的设计哲学和使用场景有所不同。Node.js 更侧重于非阻塞I/O和异步编程,而 Python 则在许多领域都有广泛的应用,包括但不限于同步和异步编程。
- 学习方法: 通过将新知识与已有知识相联系,使用你熟悉的 Python 逻辑去理解 Node.js,是一种很好的学习方法。这种方法能帮助你更快地理解新的概念,并在不同编程语言间建立联系。
你对事件监听器的理解是正确的。在 Node.js 中,事件监听器确实起到了关键作用,而在 Python 中,虽然没有显式的事件监听模式,但函数定义和调用的机制也实现了类似的功能。理解这些基础概念对于深入理解不同编程语言的设计理念和使用场景非常重要。