我正在学习EventEmitter。 我有一个简单的愚蠢测试。 (win10上的node --version v8.4.0)
const EventEmitter = require('events');
const emiter1 = new EventEmitter()
const emiter2 = new EventEmitter()
// let cnt = 1
emiter1.on('ping', () => {
// console.log('ping' + cnt++)
emiter2.emit('pong')
})
emiter2.on('pong', () => {
// console.log('pong' + cnt++)
emiter1.emit('ping')
})
emiter1.emit('ping')
我希望它会成为无限函数调用,因为emit()
是同步函数。
这是输出。:
$ node em.js
C:\tmp\em.js:13
emiter2.on('pong', () => {
^
RangeError: Maximum call stack size exceeded
at EventEmitter.emiter2.on (C:\electron-workspace\tmp\em.js:13:24)
at emitNone (events.js:105:13)
at EventEmitter.emit (events.js:207:7)
at EventEmitter.emiter1.on (C:\electron-workspace\tmp\em.js:10:17)
at emitNone (events.js:105:13)
at EventEmitter.emit (events.js:207:7)
at EventEmitter.emiter2.on (C:\electron-workspace\tmp\em.js:15:17)
at emitNone (events.js:105:13)
at EventEmitter.emit (events.js:207:7)
at EventEmitter.emiter1.on (C:\electron-workspace\tmp\em.js:10:17)
大!正如我所料。
但在我取消注释cnt
和console.log
后,我得到了一个奇怪的行为。
程序没有错误地完成,并在cnt==1600
(有时是1598,1599)停止
$ node em.js
ping1
pong2
ping3
pong4
...
...
pong1596
ping1597
pong1598
ping1599
pong1600
$
我正在运行node em.js 1> out.txt 2> err.txt
,console.log
和console.err
正确无误。但是我仍然想知道为什么错误没有直接在我的shell中打印出来?
有合理的解释吗?提前谢谢。