当有数据可从流中读取时,就会触发 'readable' 事件。 在某些情况下,为 'readable' 事件附加监听器将会导致将一些数据读入内部缓冲区。

    1. const readable = getReadableStreamSomehow();
    2. readable.on('readable', function() {
    3. // 有数据可读取。
    4. let data;
    5. while (data = this.read()) {
    6. console.log(data);
    7. }
    8. });

    当到达流数据的尽头时,'readable' 事件也会触发,但是在 'end' 事件之前触发。

    'readable' 事件表明流有新的动态:要么有新的数据,要么到达流的尽头。 对于前者,[stream.read()][stream-read] 会返回可用的数据。 对于后者,[stream.read()][stream-read] 会返回 null。 例如,下面的例子中,foo.txt 是一个空文件:

    1. const fs = require('fs');
    2. const rr = fs.createReadStream('foo.txt');
    3. rr.on('readable', () => {
    4. console.log(`读取的数据: ${rr.read()}`);
    5. });
    6. rr.on('end', () => {
    7. console.log('结束');
    8. });

    运行上面的脚本输出如下:

    1. $ node test.js
    2. 读取的数据: null
    3. 结束

    通常情况下,readable.pipe()'data' 事件的机制比 'readable' 事件更容易理解。 处理 'readable' 事件可能造成吞吐量升高。

    如果同时使用 'readable' 事件和 ['data'] 事件,则 'readable' 事件会优先控制流,也就是说,当调用 [stream.read()][stream-read] 时才会触发 'data' 事件。 readableFlowing 属性会变成 false。 当移除 'readable' 事件时,如果存在 'data' 事件监听器,则流会开始流动,也就是说,无需调用 .resume() 也会触发 'data' 事件。