2017-01-09 3 views
1

Betrachten Sie den folgenden Code, Eingabedatei und die Ergebnisse. Der setTimeout ist hier, um einen externen Anruf nachzuahmen, beispielsweise http get. Was ist der beste/einfachste Weg, um die Ergebnisse in Ordnung zu halten? Die offensichtlich hinzugefügte Latenz und das nicht gleichzeitige Laufen ist in Ordnung. rl.pause() und rl.resume() machen den Trick nicht, wahrscheinlich, weil es den Unterstreichungseingangsstrom pausiert, oder vielleicht fehlt mir hier etwas?Gibt es eine Möglichkeit, readline tatsächlich zu pausieren?

'use strict'; 

let rl = require('readline').createInterface({ 
    input: require('fs').createReadStream('inputFile') 
}); 

rl.on('line', line => { 
    rl.pause(); 
    setTimeout(_ => { 
     console.log(line); 
     rl.resume(); 
    }, Math.random() * 2000); 
}); 

Eingabedatei:

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 

Ergebnisse:

10 
6 
1 
11 
3 
7 
8 
9 
12 
2 
5 
4 

Antwort

2

Dies ist eine Einschränkung, wie die readline Modul arbeitet in NodeJS. Es pausiert das Lesen der Eingabe, tut dies jedoch nicht sofort. Dies liegt zum Teil daran, für welche Node-Ströme dies vorgesehen war.

pause und resume waren für den Gegendruck gedacht - was bedeutet, dass ihr Ziel es war, mit Produzenten zu verhandeln, die "zu schnell" waren, damit ihre Kunden mithalten konnten und um Knoten auszugleichen. Sie wurden nie im Zusammenhang mit der Gewährleistung von sofortigen Pausen konzipiert.

Sie können stattdessen niedrigere fs Operationen verwenden und die Zeilen einzeln lesen oder in einem Puffer speichern, um dies zu vermeiden. Wenn die Datei klein genug ist - einfach fs.readFile darauf zu tun und durch \n zu teilen sollte wahrscheinlich genug sein, um sie dann mit Versprechen zu durchlaufen und asynchrone Aktionen durchzuführen.

+0

Mit anderen Worten: Nein. Danke. – niry

+0

@niry ziemlich viel - ja. –

Verwandte Themen