Basic
How it works
Readable streams
Всего существует 2 основных состояния: поток и пауза.
Пауза - нужно явно вызывать stream.Read() для чтения данных из стрима в таком состоянии.
Поток - данные считываются автоматически, предоставляется в приложение максимально быстро.
По-умолчанию. стрим начинается в режиме паузы, но могут быть переключены в режим потока одним из следующих способов:
- Добавление обработчика событий 'data'
- Вызов метода resume
- Вызов метода pipe - для отправки данных в открытый для чтения стрим
Стрим можно переключить в режим паузы:
- Если нет назначений pipe -> метод stream.Pause()
- Если есть назначения pipe -> удалением любых обработчиков события 'data' и удалением всех назначений pipe вызовом метода unpipe()
! Открытый для чтения stream не будет генерировать данные пока есть механизм получения / игнорирования для этих данных. Если потребляющий механизм отключен, стрим будет предпринимать попытки остановить генерацию данных.
- При этом, удаление обработчика событий 'data' не будет автоматически приостанавливать stream.
- Если есть pipe, вызов stream.pause() не будет гарантией, что стрим останется приостановленным после очищения от этих назначений и запроса новых данных.
Принцип работы
В любой заданной точке каждый открытый stream имеет 3 возможных состояния:
flowing = null / false / true
flowing = null -> не предоставляется никакого механизма для получения данных из стрима и он генерирует данные.
flowing = true -> открытый для чтения stream активно генерирует события в связи с генерацией данных. Вызывает добавление слушателя к событию 'data', вызов метода pipe, вызов resume.
flowing = false -> временно останавливает поток событий, но не останавливает генерацию данных (могут быть собраны во внутреннем стриме буфера). Вызывает pause(), unpipe() или получение противодействия.
Promise
Interface
| Interfaice | Initial | Resolved | Rejected |
|---|---|---|---|
| then | Promise | will call all assosiated thenblocks and execute code with passed resolved data | will not be called |
| catch | Promise | will not be called | will call assosiated catch block and execute code with passed exception |
| finally | Promise | will call assosiated finally block and execute code with passed resolved data | will call assosiated catch block and execute code with not defined data |
| Initial -> Resolved | Initial -> Rejected |
|---|---|
| All assosiated then blocks will be called and resolved data will be based into it. Finally block will be called and execute code with passed resolved data. | catch block will be called with error description inside. Finally block will be called and execute code with passed underfined arg. |
Stream
Interface
Writable
| Events | Definition | When appeared |
|---|---|---|
| close | Генерируется, когда стрим и любой из его предустановленных ресурсов закрываются. Никакие события больше не генерируются, и не осуществляются расчеты. | стрим закрывается |
| drain | Событие генерируется, когда нужно восстановить запись данных в стрим. | stream.write - возвращает false |
| error | Слушатель функции обратного вызова передает единственный аргумент Error при вызове. | error возникает в момент записи данных из пайпа. Стрим не закрывается, когда генерируется событие ‘error’. |
| finish | Генерируется после вызова метода stream.end() и после того, как все данные были сброшены в предустановленную систему. | |
| pipe | stream.Readable источниковый стрим, который передается в открытый для записи | Генерируется, когда вызывается метод stream.pipe() на открытом для чтения стриме, добавляя открытый для записи стрим в настройки направления. |
| unpine | Открытый для чтения стрим Источниковый стрим, который не передает открытый для записи | Генерируется, когда метод stream.unpipe() вызывается на открытом для чтения стриме, удаляя открытый для записи стрим из настроек направления. |
Readable
| Events | Definition | When appeared |
|---|---|---|
| close | Генерируется, когда стрим и любой из его предустановленных ресурсов закрываются. Событие показывает, что никакие события больше не генерируются, и не осуществляются расчеты. ! Не все открытые для чтения стримы генерируют событие ‘close’. | стрим закрывается |
| data | Генерируется всякий раз, когда стрим уступает владение порцией данных потребителю. Добавление слушателя события ‘data’ в стрим, который не был явно приостановлен, переключает стрим в режим потока. Данные будут передаваться тогда, когда это снова станет возможным. | Стрим переключается в режим потока путем вызова readable.pipe(), readable.resume() или добавления слушателя функции обратного вызова в событие ‘data’. Событие генерируется, когда вызывается метод readable.read() и порция данных доступна для возвращения |
| end | Генерируется, когда получателю не доступны данные из стрима. | Событие не будет генерироваться пока данные не полностью получены. Это можно обойти, если переключить стрим в режим потока или вызвать с повторением stream.read() пока все данные не будут получены. |
| error | Генерируется реализацией открытого для чтения стрима в любое время. | Слушатель функции обратного вызова будет передавать единственный объект Error. Предустановленный стрим не может сгенерировать данные по причине внутренней ошибки или если реализация стрима пытается передать недопустимую порцию данных. |
| readable | Генерируется, когда есть доступные данные для чтения из стрима, после получения данных из стрима, но перед генерацией события ‘end’. ! Обычно механизмы событий readable.pipe() и ‘data’ более предпочтительны для использования, чем событие ‘readable’. | В первом случае stream.read() возвращает доступные данные. В последнем – stream.read() возвращает null. |
Duplex
Has both interfaces: Readable and Writable.
Transform
Has both interfaces: Readable and Writable.