Stream API - 转换流
在Stream API中,转换流用于实现管道链概念。 管链是多个流相互连接的过程。 原始源称为管链的起点,而最终汇点称为管链的终点。
TransformStream 接口
Stream API 支持两种类型的转换流接口 −
TransformStream 接口
TransformStreamDefaultController
TransformStream 接口
TransformStream接口用于实现管链变换流方法。
构造函数
为了创建转换流对象,TransformStream 接口提供了 TransformStream() 构造函数。 该对象代表一对流,即可写端的 WritableStream 和可读端的 ReadableStream。
语法
const newTrans = new TransformStream() Or const newTrans = new TransformStream(mtransform) Or const newTrans = new TransformStream(mtransform, writableStrategy) Or const newTrans = new TransformStream(mtransform, writableStrategy, readableStrategy)
以下是 TransformStream() 构造函数的可选参数 −
mtransform − 该对象代表 transformer。 start(controller)、transform(chunk,controller)和flush(controller)是transformer对象包含的方法。 其中控制器是 TransformStreamDefaultController 的实例。
writableStrategy − 该对象用于定义写入流的排队策略。 它需要两个参数:highWaterMark 和 size(chunk)。
readableStrategy − 该对象用于定义读取流的排队策略。 它需要两个参数:highWaterMark 和 size(chunk)。
实例属性
TransformStream 接口提供的属性是只读属性。 所以TransformStream提供的属性是 −
Sr.No. | 属性和描述 |
---|---|
1 | TransformStream.readable 此属性返回 TransformStream 的可读结尾。 |
2 | TransformStream.writable 此属性返回 TransformStream 的可写结尾。 |
TransformStreamDefaultController 接口
TransformStreamDefaultController 接口提供了各种方法来操作 ReadableStream 和 WritableStream。 当我们创建 TransformStream 时,就会自动创建 TransformStreamDefaultController。 因此它不需要任何单独的构造函数。
实例属性
TransformStreamDefaultController 接口提供的属性是只读属性。 所以 TransformStreamDefaultController 提供的属性是 −
Sr.No. | 属性和描述 |
---|---|
1 | TransformStreamDefaultController.desiredSize 此属性返回一个大小,该大小将填充流内部队列的可读部分。 |
方法
以下是TransformStreamDefaultController接口的常用方法 −
Sr.No. | 方法及说明 |
---|---|
1 | TransformStreamDefaultController.enqueue() 此方法用于将一段数据排入给定流的可读端。 |
2 | TransformStreamDefaultController.error() 此方法用于查找流的可读和可写端的错误。 TD> |
3 | TransformStreamDefaultController.terminate() 该方法用于关闭转换流的可读端和可写端的错误。 |
示例 - 创建转换流
在下面的程序中,我们创建一个自定义转换流。 因此,为了创建转换流,我们使用 TransformStream() 构造函数以及 transform()、flush()、start() 和 cancel() 函数。 Transform() 函数实现接收到的块,然后将它们转换为大写,然后使用 enqueue() 方法将数据排入队列。 flash() 方法用于处理流终止,start() 方法用于处理初始化,cancel() 方法用于处理取消。 现在我们使用 getWriter() 方法从转换流中获取 writer 来读取流的数据。 然后我们使用 getReader() 函数获取转换流的读取器。 它借助 myread() 函数从流中读取并处理转换后的数据。
<!DOCTYPE html> <html> <body> <script> // 使用 TransformStream() 构造函数创建转换流 const newTransform = new TransformStream({ transform(chunk, controller) { // 以大写形式处理接收到的块 const tData = chunk.toString().toUpperCase(); // 将转换后的数据入队并传递给下游 controller.enqueue(tData); }, // 如果需要,处理最终数据 flush(controller) { console.log('Stream is flushing'); }, // 如果需要,执行初始化 start(controller) { console.log('Stream is started'); }, // 如果流被取消,则对其进行处理 cancel(reason) { console.log('Stream got canceled:', reason); } }); // 为转换流创建编写器 const twriter = newTransform.writable.getWriter(); // 将数据写入转换流 twriter.write('pink'); twriter.write('green'); twriter.write('blue'); // 关闭流 twriter.close(); // 为转换流创建读取器 const treader = newTransform.readable.getReader(); // 从转换流中读取并处理数据 function myread(){ treader.read().then(({ done, value }) => { if (done) { console.log('Stream is ended'); return; } // 处理接收到的转换后的数据 console.log(value); // 继续从流中读取数据 myread(); }); } // 调用 myread() 开始从转换流中读取 myread(); </script> </body> </html>
结论
这就是转换流的工作原理。 它通常在我们将多个流连接在一起时使用。 在下一篇文章中,我们将了解 Stream API 中的对象模式。