Comment émettre/pipe tableau de valeurs lisible flux dans node.js?
Quelle est la meilleure façon de créer une lisible flux à partir d'un tableau et le tuyau de valeurs à une écriture de flux? J'ai vu substack de exemple à l'aide de la méthode setInterval et je peux le mettre en œuvre avec succès à l'aide de 0 pour la valeur de l'intervalle, mais je suis de parcourir un grand nombre de données et le déclenchement de gc à chaque fois est de ralentir les choses.
//Working with the setInterval wrapper
var arr = [1, 5, 3, 6, 8, 9];
function createStream () {
var t = new stream;
t.readable = true;
var times = 0;
var iv = setInterval(function () {
t.emit('data', arr[times]);
if (++times === arr.length) {
t.emit('end');
clearInterval(iv);
}
}
}, 0);
//Create the writable stream s
//....
createStream().pipe(s);
Ce que je voudrais faire est d'émettre des valeurs sans la fonction setInterval. Peut-être à l'aide de la async module comme ceci:
async.forEachSeries(arr, function(item, cb) {
t.emit('data', item);
cb();
}, function(err) {
if (err) {
console.log(err);
}
t.emit('end');
});
Dans ce cas, je itérer le tableau et émettent des données, mais jamais de tuyau de toutes les valeurs. J'ai déjà vu shinout de ArrayStream, mais je pense qu'a été créé avant v0.10 et il est un peu plus de frais généraux que je suis à la recherche d'.
- Je ne pense pas que vous serez en mesure d'obtenir beaucoup moins de frais généraux que ArrayStream (110 sloc). async va être similaire à substack de l'exemple dans l'utilisation de setImmediate. Je ne pense pas que vous avez besoin setImmediate/setInterval pour toutes les données de l'événement puisque vous ne faites pas d'IO, mais vous aurez besoin pour gérer pause/reprise qui ArrayStream fait pour vous. Curieux de voir ce que les réponses que vous obtenez.
- Merci pour l'entrée. Je suppose que mon plus gros souci avec ArrayStream était qu'il n'avait pas été mis à jour depuis les changements dans le Flux de l'API dans v0.10, mais ces inquiétudes pourraient être infondées. J'ai été surpris qu'elle avait si peu de téléchargements ce qui me fait croire que d'autres font les choses différemment.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez résoudre ce problème en créant un lisible flux et en poussant des valeurs en elle.
Tableau de chaînes de caractères ou des tampons de flux
Si vous travaillez avec un tableau de chaînes de caractères ou des tampons, cela va fonctionner:
Notes:
readable.pipe(process.stdout)
fait deux choses: met le ruisseau en "coulant" mode et met en place le processus.stdout écriture de flux pour recevoir des données dereadable
Readable#push
méthode est pour le créateur de la lisible flux, pas le flux de consommation.Readable#push(null)
pour signaler qu'il n'y a plus de données.Tableau de non-chaînes pour diffuser
Pour créer un flux à partir d'une variété de choses qui ne sont ni cordes, ni tampons, vous avez besoin à la fois lisibles flux et l'écriture de flux pour être en "Object Mode". Dans l'exemple ci-dessous, j'ai fait les modifications suivantes:
{objectMode: true}
Au lieu de la tuyauterie pour
process.stdout
, pipe à une simple écriture de flux qui est en mode objet.Performance Note
Où proviennent les données? Si c'est un flux de source de données, il est préférable de manipuler le flux à l'aide d'un flux de transformation que de les convertir vers/à partir d'un tableau.
readable.pipe(writable).pipe(somethingElse)
? Si oui,writable
un flux de Transformation. Je peux ajouter des informations à ce sujet si c'est ce que vous cherchez._read()
du Lisible flux. Voir ici pour une semblable réponse stackoverflow.com/a/22085851/2012945 (chaînes de cours d'eau).tl;dr;
Je me suis retrouvé à l'aide de ArrayStream pour cela. Il n'a résoudre le problème avec le GC être déclenchée trop souvent. J'ai été d'obtenir des avertissements pour un processus récursif.nextTick de nœud ainsi modifié la nextTick rappels dans ArrayStream à setImmediate et qui fixe les mises en garde et semble bien fonctionner.
C'est une vieille question, mais si quelqu'un trébuche sur ce, nœud-stream-tableau est beaucoup plus simple et plus élégante de la mise en œuvre de Node.js >= v0.10