2017-08-28 45 views
0

采取nodejs-下面的代码:为什么数据事件只能阻止NodeJS运行时间退出?

console.log("Hello world"); 
process.stdin.on('connect', function() { 

    }); 

此打印Hello World,然后节点退出。但是当我用'data'事件替换connect事件时,Node运行时不会退出。

这是为什么? EventEmitter的数据事件有什么特别之处?它是否打开套接字连接?所以在()方法是存在的,如下面的代码 - :

function on(event, callback) { 
if(event === 'data') { 
    //open socket 
    //do work 
    } 
else { 
    //do non-socket work 
    } 
} 

是否有一个明确的答案,为什么添加监听到数据事件“魔术”般地打开一个套接字。

+0

没有什么特别之处“数据”事件。这是一个像任何其他事件一样的事件。 – ralphtheninja

+0

@ralphtheninja很棒。那么,为什么当我们为数据事件附加一个侦听器时,nodejs运行时不会退出,但是当我们为其他事件附加一个侦听器时会退出 –

+0

很难说。如果你能展示更多的代码会很好。 – ralphtheninja

回答

0

如果我们假设index.js包含

process.stdin.on('data', console.log) 

和你做node index.js,则处理等待上stdin输入。

如果你通过例如在stdin上发送一些数据echo woohoo | node index.js然后缓冲区将被写入并且进程退出。

1

Node.js事件循环有几个处理阶段,在你的情况下它是poll阶段。例如,传入数据(process.stdin.on('data', cb))的哪个进程是如此,直到存在可处理此事件的回调,此事件可能发生,节点事件循环不为空并且节点不会退出。

process.stdin是已经撂荒事件只读流:

  • 接近
  • 数据
  • 结束
  • 错误
  • 可读

所以没有像connect。上述

process.stdin.on('readable', function() { 
    console.log('Readable'); 
}); 

代码将打印Readable和退出,因为点火事件流后不flowing状态,以便将退出事件循环,因为它是空的,但data事件集流状态flowing, 因此,如果流状态设置到flowing,如果readableState.readingtrue它将阻止节点退出。 如果你

process.stdin.on('data', function(data) { 
    console.log(data.toString()); 
}); 

,如果你当这是运行它会像回声在控制台中写任何东西。

https://github.com/nodejs/node/blob/master/lib/_stream_readable.js#L774-L795

你可以阅读完整的解释事件循环是如何工作在这里https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/

+0

我的回答中无法理解的是,当我附加一个侦听器时,为什么它会等待要收到的数据?而当我不附加听众时,什么都不会发生,那么投票阶段会消失吗?像fs.readFile这样的函数实际上做了一些工作,然后调用回调函数,但为数据事件附加一个侦听器什么也不做。为什么要等待? –

+0

还有哪些事件属于轮询阶段,哪些事件属于计时器阶段。我想我从错误的角度看待这个问题。您可否加入关于如何编写节点程序的直觉。 –

+0

@ ng.newbie现在看我编辑的答案 –

相关问题