关于节点中console.log的奇怪行为

时间:2018-01-18 07:13:07

标签: javascript node.js terminal console.log eventemitter

我正在学习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)

大!正如我所料。 但在我取消注释cntconsole.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.txtconsole.logconsole.err正确无误。但是我仍然想知道为什么错误没有直接在我的shell中打印出来? 有合理的解释吗?提前谢谢。

0 个答案:

没有答案