流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 - 此对象表示转换器。start(controller)、transform(chunk, controller)和flush(controller)是转换器对象包含的方法。其中controller是TransformStreamDefaultController的实例。

  • writableStrategy - 此对象用于定义写流的排队策略。它采用两个参数:highWaterMark和size(chunk)。

  • readableStrategy - 此对象用于定义读流的排队策略。它采用两个参数:highWaterMark和size(chunk)。

实例属性

TransformStream接口提供的属性是只读属性。因此,TransformStream提供的属性为:

序号 属性和描述
1

TransformStream.readable

此属性返回TransformStream的可读端。

2

TransformStream.writable

此属性返回TransformStream的可写端。

TransformStreamDefaultController 接口

TransformStreamDefaultController接口提供各种方法来操作ReadableStream和WritableStream。当我们创建TransformStream时,TransformStreamDefaultController会自动创建,因此不需要任何单独的构造函数。

实例属性

TransformStreamDefaultController接口提供的属性是只读属性。因此,TransformStreamDefaultController提供的属性为:

序号 属性和描述
1

TransformStreamDefaultController.desiredSize

此属性返回一个大小,该大小将填充流的内部队列的可读端。

方法

以下是TransformStreamDefaultController接口常用的方法:

序号 方法和描述
1

TransformStreamDefaultController.enqueue()

此方法用于在给定流的可读端入队一段数据。

2

TransformStreamDefaultController.error()

此方法用于查找流的可读端和可写端的错误。

3

TransformStreamDefaultController.terminate()

此方法用于关闭变换流的可读端和可写端的错误。

示例 - 创建变换流

在下面的程序中,我们创建了一个自定义变换流。因此,要创建变换流,我们使用TransformStream()构造函数以及transform()、flush()、start()和cancel()函数。transform()函数实现接收块,然后将其转换为大写,然后使用enqueue()方法入队数据。flush()方法用于处理流终结,start()方法用于处理初始化,cancel()方法用于处理取消。现在,我们使用getWriter()方法从变换流中获取写入器以读取流的数据。然后,我们使用getReader()函数获取变换流的读取器。它在myread()函数的帮助下读取和处理来自流的转换数据。

<!DOCTYPE html>
<html>
<body>
<script>
   // Create a transform stream using TransformStream() constructor
   const newTransform = new TransformStream({
      transform(chunk, controller) {
         // Processing the received chunk in uppercase
         const tData = chunk.toString().toUpperCase();

         // Enqueue the transformed data and passed it to the downstream
         controller.enqueue(tData);
      },
      // Handling the finalized data, if required
      flush(controller) {
         console.log('Stream is flushing');
      },
      // Performing the initialization, if required
      start(controller) {
         console.log('Stream is started');
      },
      // Handling the stream if it is cancelled  
      cancel(reason) {
         console.log('Stream got canceled:', reason);
      }
   });
   // Creating a writer for the transform stream
   const twriter = newTransform.writable.getWriter();

   // Writing the data into the transform stream 
   twriter.write('pink');
   twriter.write('green');
   twriter.write('blue');

   // Closing the stream
   twriter.close();

   // Creating a reader for the transform stream
   const treader = newTransform.readable.getReader();

   // Read and process data from the transform stream
   function myread(){
      treader.read().then(({ done, value }) => {
         if (done) {
            console.log('Stream is ended');
            return;
         }
         // Processing the received transformed data
         console.log(value);

         // Continue reading data from the stream
         myread();
      });
   }
   // Calling the myread() to start reading from the transform stream
   myread();
</script>
</body>
</html>
Transform Streams

结论

这就是变换流的工作方式。当我们将多个流连接在一起时,通常会使用它。在下一篇文章中,我们将学习Stream API中的对象模式。

广告