Как управлять backpressure в readable stream node js

287
02 марта 2018, 19:14

Добрый день.

У меня вопрос по backpressure в readable stream. На сайте nodejs есть статья https://nodejs.org/en/docs/guides/backpressuring-in-streams/. Там говориться что backpressure может быть не только в writable, но и в readable stream. Но к сожалению, там описано только, как не надо делать:

// This is problematic as it completely ignores return value from push
// which may be a signal for backpressure from the destination stream!
class MyReadable extends Readable {
  _read(size) {
    let chunk;
    while (null !== (chunk = getNextChunk())) {
      this.push(chunk);
    }
  }
}

Как надо - не написано. В интернете я смогла найти только такой вариант: http://codewinds.com/blog/2013-08-04-nodejs-readable-streams.html

let i = 10;
const rs = new Readable({
  highWaterMark: 500, // для создания backpressure
  read(size) {
    const data = 'In Node.js I\'m using the fs.createWriteStream method to append data to a local file. In the Node documentation they mention the drain event when using fs.createWriteStream, but I don\'t understand it.\n';
    let ready = true;
    while (ready) { // продолжать только, если push возвращает true
      if (i < 0) {
        this.push(null);
        ready = false;
        return;
      }
      const buf = Buffer.from(data);
      i--;
      ready = this.push(buf);
      console.log(ready); // будет переодически false
    }
  },
});

Не могу понять как работает этот код. Тут же нет события drain, как в writable streams, так что узнать, когда можно снова вызывать _read, мы можем только вызвав сам _read и посмотрев, что он вернет (true или false) - но на этот момент кусок информации мы уже отправили, не зная есть backpressure или нет. Таким образом, получается, что мы выходим из цикла только для того, чтобы опять вызвать _read, не зная рассосался там затор или нет.

Может кто-нибудь пояснить, что на самом деле происходит при вызове _read? Может есть другие методики работы с backpressure в readable stream?

READ ALSO
небольшая задачка по React Js [требует правки]

небольшая задачка по React Js [требует правки]

Это задание требуется выполнить на React Js, тут нужно поля ввода, но как данные из него отправить или взять с помощью методов я не могу понять

287
Не срабатывает POST запрос

Не срабатывает POST запрос

Есть два похожих post запросаПервый работает адекватно

293
звук один раз при обновлении

звук один раз при обновлении

Таблица на моем сайте обновляется, например, каждые 10 секунд, проверяя наличие новых записей через AJAX

250