Ajax 简明教程

Stream API - Writeable Streams

可写流是可以写入数据的流。它们通常在 JavaScript 中由 WritableStrem 对象表示。它在底层接收器上创建了一个抽象。底层接收器是原始数据被写入的较低级别的输入/输出接收器。

在可写流中,一个写入器写入数据。它一次写入一个块,其中块是数据的一部分。此外,您可以使用任何代码生成要写入的块,并且写入器和相关代码一起称为生产者。在单个流上,只允许一个写入器写入数据。在那个时候,流对那个指定的写入器被锁定,不允许其他写入器写入。如果您希望另一个写入器写入,则必须在该另一个写入器被允许写入之后终止第一个写入器。每个写入器都有自己的控制器来控制流。

此外,可写流具有与可读流一样的内部队列。它还跟踪已被写入但未由底层接收器处理的块。

writable stream

WritableStream Interfaces

Stream API 支持三种类型的可写流接口 −

  1. WritableStream Interface

  2. WritableStreamDefaultWriter Interface

  3. WritableStreamDefaultController Interface

WritableStream Interface

WritableStream 接口用于将流数据写入接收器。它的对象带有内置的反压和排队。

Constructor

要创建一个 WritableStream 对象,WritableStream 接口提供了一个 WritableStream() 构造函数。

Syntax

const newWrite = new WritableStream(UnderlyingSink)
Or
const newWrite = new WritableStream(UnderlyingSink, QueuingStrategy)

WritableStream() 构造函数具有以下可选参数 -

UnderlyingSink - 该对象提供各种特性和信息,显示写入流实例的行为。它获取四个参数:start(controller)、write(chunk, controller)、close(controller) 和 abort(reason)。

QueuingStrategy - 该对象用于定义写入流的排队策略。它获取两个参数:highWaterMark 和 size(chunk)。

Instance Properties

WritableStream 接口提供的属性为只读属性。因此 WritableStream 提供的属性如下:

Sr.No.

Property & Description

1

WritableStream.locked 该属性用于检查 WritableStream 是否已锁定到编写器。

Methods

以下是 WritableStream 接口中常用的方法:

Sr.No.

Property & Description

1

WritableStream.close() 该方法用于关闭流。

2

WritableStream.abort() 该方法用于终止流。

3

WritableStream.getWriter() 该方法用于获取 WriteableStreamDefaultWriter 的新对象,并将流锁定为此实例。当流被锁定时,其他编写器不能获取流,直至当前对象被释放。

WritableStreamDefaultWriter Interface

WritableStreamDefaultWriter 接口用于表示一个默认编写器,它将数据块写入流。

Constructor

要创建一个 WritableStreamDefaultWriter 对象,WritableStreamDefaultWriter 接口提供了一个 WritableStreamDefaultWriter() 构造函数。

Syntax

const newWrite = new WritableStreamDefaultWriter(myStream)

此构造函数仅包含一个参数,它便是 myStream。它将读取 ReadableStream。

Instance Properties

WritableStreamDefaultWriter 接口提供的属性为只读属性。因此 WritableStreamDefaultWriter 提供的属性如下:

Sr.No.

Property & Description

1

WritableStreamDefaultWriter.closed 该属性返回一个承诺,如果流因某些错误而关闭或拒绝,则该承诺将解决。它允许你创建一个在流进程结束时响应的程序。

2

WritableStreamDefaultWriter.desiredSize 该属性用于获取将满足流内部队列的所需大小。

3

WritableStreamDefaultWriter.ready 该属性返回一个承诺,当流内部队列的所需大小从负数转变为正数时,该承诺将解决。

Methods

以下是 WritableStreamDefaultWriter 接口中常用的方法:

Sr.No.

Method & Description

1

WritableStreamDefaultWriter.abort() 该方法用于终止流。

2

WritableStreamDefaultWriter.close() 此方法用于关闭可写流。

3

WritableStreamDefaultWriter.releaseLock() 此方法用于移除写入器对相应流的锁。

4

WritableStreamDefaultWriter.write() 此方法用于将传递的数据块写入 WritableStream 及其底层接收器。它将返回一个 Promise,该 Promise 解决为确定写入操作是失败还是成功。

WritableStreamDefaultController Interface

WritableStreamDefaultController 接口表示一个控制器,允许我们控制 WritableStream 状态。它不提供任何控制器,并且该实例在构造 WritableStream 时自动创建。

Instance Properties

WritableStreamDefaultController 接口提供的属性为只读属性。因此,WritableStreamDefaultController 提供的属性为 −

Sr.No.

Property & Description

1

WritableStreamDefaultController.signal 此属性将返回与指定控制器相关的 AbortSignal。

Methods

以下是 WritableStreamDefaultController 接口常用的方法 −

Sr.No.

Method & Description

1

WritableStreamDefaultController.error() 此方法会导致与相关写入流的任何未来交互都会出错。

Example - Creating Writable Stream

在以下程序中,我们创建了一个自定义可写流。因此,要创建一个可写流流 API,请提供具有 write()、cancel() 和 abort() 函数的 WritableStream() 构造函数。write() 函数用于记录接收到的块,cancel() 函数用于处理流被取消时,abort() 函数用于处理流被中止时。现在,我们使用 getWriter() 方法创建了一个写入器,以便在流中写入数据。因此,写入器将数据写入块中,并在完成写入操作后关闭流。

<!DOCTYPE html>
<html>
<body>
<script>
   // Creating a writable stream
   const writStream = new WritableStream({
      // processing the received chunks
      write(chunk) {
         console.log('Received chunk:', chunk);
      },
      // Closing the stream
      close(){
         console.log('Stream is closed');
      },
      // Handling the aborting stream
      abort(reason){
         console.log('Stream is aborted:', reason);
      }
   });
   // Create a writer to write in the stream
   const myWriter = writStream.getWriter();

   // Writing in the stream
   myWriter.write('Orange');
   myWriter.write('Blue');
   myWriter.write('Pink');
   myWriter.write('Red');

   // Close the stream
   myWriter.close();
</script>
</body>
</html>

Output

writable stream2

Conclusion

因此,这是一个可写流。借助可写,我们可以轻松地将数据写入资源,而无需将整个数据加载到内存中。现在,在下一篇文章中,我们将讨论 Stream API 中的转换流。