ReadStream推送

时间:2016-08-01 09:12:33

标签: javascript node.js

我读到如果内部缓冲区已满,ReadStream #push方法返回false,我做了一个实验。

   

 "use strict";

    var Readable = require("stream").Readable;
    var i = 0;

    class CountableStream extends Readable {
        constructor(options) {
            super(options);
        }

        _read() {
            if (i < 10) {
                i++;
                for (var k = 1; k <= 3; k++) {
                    // highWaterMark is set to 3, while we push 3 objects here, 
                    var ret = this.push({test: i * k});
                    console.log(ret); //print "false" here, which means the internal buffer is full
                }

            } else {
                this.push(null);
            }
        }
    }

    // Set highWaterMark to 1 purposefully
    var s = new CountableStream({objectMode: true, highWaterMark: 1});
    s.on("data", function (data) {
//I can print all data without losing any
        console.log("!!" + JSON.stringify(data));
    });

正如您可能从代码中读到的那样,我正在推动更多的元素,而不是内部缓冲区可以容纳,但我仍然可以打印所有元素而不会遗漏任何元素。 显然,过多的数据被真正地推到缓冲区而不会丢弃它们。

然后我怀疑是

  1. “highWaterMask”只是提示控制速度而非严格限制吗?

  2. 如果push方法返回false,我想我可以调用“this.pause()”来暂时停止流,但是我该如何重新恢复此流?我应该在任何事件回调中调用resume方法吗?

  3. 谢谢!

0 个答案:

没有答案