Un symbole par stream temporel avec noeud

J’essaie d’implémenter un stream qui renvoie un symbole d’un fichier à chaque événement ‘data’. J’ai fini avec le code ci-dessous:

var util = require('util'), fs = require('fs'), Readable = require('stream').Readable; var util = require('util'); var Readable = require('stream').Readable; var SymbolReadStream = function(filename, options) { Readable.call(this); this._readable = fs.createReadStream(filename, options).pause(); self = this; this._readable.on('readable', function() { var chunk; chunk = self._readable.read(1); // I believe the problem is here self._readable.pause(); }); }; util.inherits(SymbolReadStream, Readable); // inherit the prototype methods SymbolReadStream.prototype._read = function() { this._readable.resume(); }; var r = new SymbolReadStream("test.txt", { encoding: 'utf8', }); r.on('data', function(el) { console.log(el); }); 

mais ce code ne fonctionne pas. S’il vous plaît aider. Y a-t-il un moyen plus facile d’obtenir le comportement?

Dans l’implémentation en stream, il n’y a pas d’événement ‘data’ émetteur dans le gestionnaire. A cause de cela, console.log n’est jamais appelé. Après avoir ajouté des événements, ils seront diffusés symbole par symbole. Exemple ci-dessous:

 var util = require('util'), fs = require('fs'), Readable = require('stream').Readable; function SymbolReadStream(filename, options) { if (!(this instanceof SymbolReadStream)) { return new SymbolReadStream(length, options); } Readable.call(this); this._readable = fs.createReadStream(filename, options); } util.inherits(SymbolReadStream, Readable); // inherit the prototype methods SymbolReadStream.prototype._read = function() { var self = this; this._readable.on('readable', function() { var chunk; while (null !== (chunk = self._readable.read(1))) { self.emit('data', chunk); } }); this._readable.on('end', function() { self.emit('end'); }); }; var r = new SymbolReadStream("test.txt", { encoding: 'utf8', }); r.on('data', function(el) { console.log(el); }); r.on('end', function(el) { console.log('done'); }); 

Cet article donne un excellent indice pour répondre à votre question.

En outre, vous devriez utiliser une boucle au niveau du tuyau qui constituerait un moyen plus simple d’accomplir ce que vous essayez de faire: raccorder un adaptateur au stream de fichiers au lieu de le boucler .

Cela dit, personnellement, je ne réinventerai pas la roue ici et chercherais simplement des modules qui peuvent y parvenir. Surtout les modules “scindés”, en les divisant sur chaque caractère, plutôt que sur de nouvelles lignes. Par exemple, event-stream a une méthode split qui ” prend les mêmes arguments que ssortingng.split sauf qu’elle utilise par défaut ‘\ n’ au lieu de ‘,’ “. La logique serait donc d’essayer myStream.pipe(es.split('')) mais les modules prennent ceci comme myStream.pipe(es.split()) qui se casse sur des lignes. Alors, voici ma solution, en utilisant un regex pour dire ” pause sur chaque caractère

 var es = require('event-stream'); var fs = require('fs'); var symbolStream = fs.createReadStream(filename, options).pipe(es.split(/(?!$)/)); 

EDIT : event-stream semble utiliser le module séparé en interne, vous pouvez donc même essayer

 var split = require('split'); var fs = require('fs'); var symbolStream = fs.createReadStream(filename, options).pipe(split(/(?!$)/)); 

( ce test lâche est responsable de la conversion de '' en \r\n )