Добрый день.
У меня вопрос по 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?
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости