Closed
Description
- Version:v8.4.0
- Platform: 64-bit (Windows10)
- Subsystem:
Stackoverflow: a strange behavior about the EventEmitter in node
I am learning EventEmitter. and I have a simple stupid test. (node --version v8.4.0 on win10)
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')
I expect it will become a infinity function call, because emit() is a sync function.
Here is the output.:
$ 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)
Great! Just as I expected. But after I uncomment the cnt and console.log, I got a strange behavior. The program finished without an error, and stop at cnt==1600 (sometime is 1598, 1599)
$ node em.js
ping1
pong2
ping3
pong4
...
...
pong1596
ping1597
pong1598
ping1599
pong1600
$
Finally, I run node em.js 1> out.txt 2> err.txt
and both console.log
and console.err
are correct just as I expect. But I'm still wondering why the err didn't print out directly in my shell?
Is there a reasonable explanation?