Heim  >  Artikel  >  Web-Frontend  >  Ein Beispiel zur Erläuterung des beschreibbaren Objekts in Node.js_node.js

Ein Beispiel zur Erläuterung des beschreibbaren Objekts in Node.js_node.js

WBOY
WBOYOriginal
2016-05-16 15:48:191461Durchsuche

Solange Sie mit nodejs gespielt haben, müssen Sie mit Writable in Kontakt gekommen sein. Der res-Parameter im Anforderungsrückrufparameter des http-Moduls ist ein beschreibbares Objekt. Wir schreiben oft eine Menge Dinge hinein und rufen schließlich die End-Methode auf, oder? Dies sind alles Verhaltensweisen von Writable.
Das von uns manuell erstellte beschreibbare Objekt wird dem Benutzer übergeben, daher werden die Schreib- und Endmethoden vom Benutzer aufgerufen. Woher wissen wir als Anbieter, welche Vorgänge unsere beschreibbaren Objekte von Benutzern ausgeführt wurden? Erraten Sie einfach diese API, ich werde zuerst ein bestimmtes Ereignis erraten. Aber nein! Wie Readable muss es auch eine Methode überschreiben, um auf Operationen zu warten. Das Folgende ist ein Beispiel für die Erstellung eines Writable, damit Benutzer Inhalte darin schreiben und überwachen können, was der Benutzer schreibt (basierend auf babel-node):

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);

Identisch mit _read von Readable. Wenn das obige _write nicht überschrieben wird, wird eine Ausnahme ausgelöst:

Error: not implemented
  at Writable._write (_stream_writable.js:430:6)
  at doWrite (_stream_writable.js:301:12)

Darüber hinaus ist write als asynchrone Methode konzipiert und sein dritter Parameter kann im Abschlussrückruf übergeben werden. Die sogenannte Vervollständigung besteht darin, dass in der Implementierungsfunktion _write der nächste Parameter aufgerufen wird. Es gibt einen Grund, warum das Schreiben asynchron ausgelegt ist. Wenn es synchron ausgeführt wird, können Sequenzfehler auftreten, wenn wir einige asynchrone Transaktionen in der _write-Methode verarbeiten müssen. Beispielsweise ist der Schreibvorgang einer Festplattendatei asynchron. Wenn wir diesen asynchronen Vorgang beim Schreiben einer Datei ignorieren, wird der aktuelle Schreibvorgang möglicherweise zuerst ausgeführt, wenn der vorherige Schreibvorgang blockiert und nicht abgeschlossen ist. Wir sollten also vernünftigerweise next in _write aufrufen (muss aufgerufen werden, sonst bleibt es in der Warteschleife hängen und kann nicht mit dem Schreiben fortfahren).
Wenn das Schreiben der Daten abgeschlossen ist, wird schließlich das Finish-Ereignis ausgelöst, was bedeutet, dass der Benutzer die End-Methode aufruft. Wenn Sie einen Dateischreibvorgang durchführen, sollten Sie die Datei zu diesem Zeitpunkt schließen.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn