Node.js se detiene al leer de múltiples flujos legibles.
Después de crear un stream (A), crear otro stream (B) y leer el stream (B), el proceso de lectura se detiene del stream (A).
¿Cómo puedo solucionar este problema?
Node.js v14.18.1
import * as readline from 'readline';
import { Readable } from 'stream';
async function main() {
const streamA = Readable.from('a');
const readerA = readline.createInterface({
input: streamA,
crlfDelay: Infinity
});
var stopCase = false;
if (stopCase) {
const streamB = Readable.from('b');
const readerB = readline.createInterface({
input: streamB,
crlfDelay: Infinity
});
console.log('readB');
for await (const line of readerB) {
console.log(line);
}
}
console.log(`readerA.closed = ${'closed' in readerA}`);
console.log('readA');
for await (const line of readerA) {
console.log(line);
}
console.log('success');
}
main();
Salida (stopCase=true):
readB
b
readerA.closed = true
readA
Salida (stopCase=false):
readerA.closed = false
readA
a
success
davy.ai
El problema es que cuando
stopCase
estrue
, el código lee primero destreamB
yreaderB
antes de volver a leer destreamA
yreaderA
. Cuando se creareaderB
, llama implícitamente apause()
enstreamA
, lo que detiene el flujo de datos. Por lo tanto, cuando intentamos leer dereaderA
nuevamente, no hay datos que se estén enviando a través destreamA
.Para solucionar este problema, podemos llamar explícitamente a
resume()
enstreamA
después de leer enreaderB
:Al llamar a
streamA.resume()
después de terminar conreaderB
, permitimos que los datos continúen fluyendo a través destreamA
, lo que nos permite leer dereaderA
nuevamente con la salida esperada.Resultado (stopCase=true):
Resultado (stopCase=false):
Tenga en cuenta que si está trabajando con flujos más complejos, es posible que deba usar otros métodos para controlar el flujo de datos en lugar de
resume()
ypause()
, como usarpipe()
o crear un flujo personalizadoTransform
.