Потоки чтения
Все потоки чтения должны реализовывать абстрактный класс stream.Readable.
Данный класс имеет следующую событийную модель:
stream.Readable
^ ^
| |
fs.ReadStream http.IncomingMessage
Любой наследник гарантирует, что он предоставит событийную модель родителя.
Поэтому мы можем написать следующий код
Кроме того, классы наследники могут привносить дополнительные этапы в существующую событийную модель класса. Например этот же fs.ReadStream привнес вот что:
Все потоки чтения должны реализовывать абстрактный класс stream.Readable.
Данный класс имеет следующую событийную модель:
Вот пример некоторых наследников данного класса
^ ^
| |
fs.ReadStream http.IncomingMessage
Любой наследник гарантирует, что он предоставит событийную модель родителя.
Поэтому мы можем написать следующий код
var fs = require('fs');
var stream = new fs.ReadStream(someBigFilePath);
stream.on('readable', function(){ // срабатывает каждый раз когда буферный чанк(64К) заполнен,
//после чего мы можем считать из этого системного чанка заболненный буфер байт.
//когда мы разгрузим этот буфер, ОС снова готова читать следующий чанк дайт из файла,
//что приведет к повторному вызову этого колбека
var data = stream.read();
console.log(data);
});
stream.on('end', function(){
console.log("THE END");
});
Кроме того, классы наследники могут привносить дополнительные этапы в существующую событийную модель класса. Например этот же fs.ReadStream привнес вот что:
Маленькая деталь, эти классы очевидно, что наследники EventEmitter, поэтому нужно не забыть определить реакцию на stream.on('error'..., потому что в случае ошибки наши скрипты будут падать.


Комментариев нет:
Отправить комментарий