Maison  >  Article  >  interface Web  >  Une brève analyse de l'objet Readable dans le module Stream de Node.js_node.js

Une brève analyse de l'objet Readable dans le module Stream de Node.js_node.js

WBOY
WBOYoriginal
2016-05-16 15:48:16881parcourir

J'ai toujours été réticent à parler de nodejs, car dès la première fois que je l'ai vu, j'ai trouvé son design vraiment dégoûtant. Mais il n'y a aucun moyen, la Spécification du flux n'a pas encore été popularisée, et il y a en effet beaucoup de choses qui dépendent du flux nodejs pour être implémentées, donc je ne peux que me tenir le nez, mordre la balle et la tirer out. Cela sent et est difficile. L'objet de flux nodejs.
Nodejs est livré avec un module appelé stream En l'introduisant, vous pouvez obtenir un ensemble de constructeurs d'objets stream. Maintenant, je ne parle que du flux le plus simple. Lisible.
En fait, presque tous ceux qui ont utilisé nodejs sont entrés en contact avec des instances Readable, mais ils n'y prêtent tout simplement pas beaucoup d'attention. Un exemple très typique. Dans le module http, nous aurons des objets req et res lors du traitement de chaque requête qui est en fait un objet Readable. Nous pouvons lire la partie entité de la requête HTTP sous la forme d'un flux sur cette requête.
La question est donc : pourquoi le module http est-il conçu ici en streaming ? Ou poser cette question depuis une autre dimension est "Comment nodejs obtient-il le contenu de la requête POST ?". Les étudiants qui savent utiliser les moteurs de recherche peuvent certainement trouver facilement une telle réponse : écoutez l'événement de données pour collecter des données et fusionnez les données collectées dans l'événement final. Oui, c'est la solution à ce problème. Mais pourquoi est-il conçu de cette façon ? Serait-il formidable de pouvoir obtenir le contenu POST directement comme PHP ? En fait, cette conception est bénéfique. Si les données que nous recevons sont illégales, je peux les détecter immédiatement, réagir et me déconnecter. Cela peut éviter certains coûts de transmission inutiles. Par exemple, lors du téléchargement d'une image, il se peut que l'utilisateur sélectionne par erreur un fichier exécutable volumineux. Nous n'avons pas besoin d'attendre que le fichier soit complètement téléchargé. Nous n'avons besoin que de quelques octets dans l'en-tête du fichier pour déterminer si un fichier est une image. . En utilisant la conception du flux ici, vous pouvez d'abord lire les premiers octets à utiliser.
L'événement de données et l'événement de fin mentionnés ci-dessus sont tous deux des événements lisibles. Ces deux événements indiquent respectivement la réception des données et l'achèvement de la réception des données. Donc en fait, nous connaissons déjà l’utilisation de Readable, mais beaucoup de gens ne savent pas qu’il s’agit d’un objet Readable.
Mais les deux événements ci-dessus ne sont que des événements destinés aux consommateurs de Readable. Comment pousse-t-il une donnée en interne dans l'objet Readable afin que Readable puisse déclencher ces événements ? Ensuite, c'est la méthode push. Voici un exemple qui crée un objet Readable qui diffuse un nombre incrémentiel (babel-node est utilisé ici)

import stream from 'stream';

var r = new stream.Readable;

r.on('data', data => {
 console.log(data + '');
});

r.on('end', data => {
 console.log('end');
});

r._read = () => {
 // console.log('before read');
};

void function callee(i) {
 if(i < 10) {
  r.push(i + ''); // 只能传入字符串或 Buffre 对象
 } else {
  r.push(null); // 当输入一个 null 时表示流传输完成,触发 end 事件 
 }
 setTimeout(callee, 500, i + 1);
}(0);

Si vous regardez attentivement le code ci-dessus, vous trouverez un endroit très magique. Ce code remplace la méthode _read. Qu'est-ce que c'est ? En fait, je pense aussi que c'est un piège. Je ne me plaindrai pas de ce style de dénomination privé. Pourquoi dois-je remplacer cette méthode pour l'implémenter ? Si cette méthode n'est pas remplacée, une exception sera levée lors de l'appel de push :

 Error: not implemented
  at Readable._read (_stream_readable.js:464:22)
  at Readable.read (_stream_readable.js:341:10)

Ce qui précède représente l'utilisation de base des objets Readable. Mais il y a d'autres pièges à surmonter. Cet article n'est que l'introduction la plus simple pour permettre à tout le monde d'apprendre à créer un objet lisible capable de générer des données. Quant à certaines méthodes de base telles que la lecture, elles font également partie des conceptions non scientifiques.

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn