Tant que vous avez joué avec nodejs, vous devez être entré en contact avec Writable. Le paramètre res dans le paramètre de rappel de requête du module http est un objet Writable. Nous y écrivons souvent un tas de choses et finalement appelons la méthode end, n'est-ce pas ? Ce sont tous des comportements de Writable.
L'objet Writable que nous créons manuellement est donné à l'utilisateur, donc les méthodes d'écriture et de fin sont appelées par l'utilisateur. En tant que fournisseur, comment savoir quelles opérations nos objets Writable ont été effectuées par les utilisateurs ? Devinez simplement cette API, je vais d'abord deviner un certain événement. Mais non ! Comme Readable, il doit également remplacer une méthode pour écouter les opérations. Ce qui suit est un exemple de création d'un Writable pour permettre aux utilisateurs d'y écrire du contenu et de surveiller ce que l'utilisateur écrit (en fonction du nœud babel) :
import stream from 'stream'; var w = new stream.Writable; w._write = (buffer, enc, next) => { console.log(buffer + ''); next(); // 触发「写入完成」 }; w.on('finish', () => { console.log('finish'); }); void function callee(i) { if(i < 10) { w.write(i + '', 'utf-8', () => { // 写入完成 }); } else { w.end(); } setTimeout(callee, 10, i + 1); }(0);
Identique au _read de Readable, si le _write ci-dessus n'est pas écrasé, une exception sera levée :
Error: not implemented at Writable._write (_stream_writable.js:430:6) at doWrite (_stream_writable.js:301:12)
De plus, write est conçu comme une méthode asynchrone et son troisième paramètre peut être transmis dans le rappel d'achèvement. Ce qu'on appelle l'achèvement est que dans la fonction d'implémentation _write, le paramètre suivant est appelé. Il y a une raison pour laquelle l'écriture est conçue pour être asynchrone. Si elle est exécutée de manière synchrone, des erreurs de séquence peuvent survenir lorsque nous devons gérer certaines transactions asynchrones dans la méthode _write. Par exemple, l'opération d'écriture d'un fichier disque est asynchrone. Si nous ignorons cette opération asynchrone lors de l'écriture d'un fichier, alors si l'opération d'écriture précédente est bloquée et n'est pas terminée, l'opération d'écriture en cours peut être exécutée en premier. Nous devrions donc raisonnablement appeler next dans _write (doit être appelé, sinon il sera bloqué en attente et incapable de continuer à écrire).
Enfin, lorsque l'écriture des données est terminée, l'événement finish sera déclenché, ce qui signifie que la méthode end est appelée par l'utilisateur. Si vous effectuez une opération d'écriture de fichier, vous devez fermer le fichier à ce moment-là.