流 API - 可寫流



可寫流是可以寫入資料的流。它們通常在 JavaScript 中由 WritableStream 物件表示。它在底層接收器上建立了一個抽象。底層接收器是寫入原始資料的更低級別的輸入/輸出接收器。

在可寫流中,寫入器寫入資料。它一次寫入一個塊,其中一個塊是一段資料。此外,您可以使用任何程式碼生成要寫入的塊,並且寫入器和相關的程式碼一起被稱為生產者。在一個流上,只允許一個寫入器寫入資料。此時,流被鎖定到該指定的寫入器,其他任何寫入器都不允許寫入。如果您希望另一個寫入器寫入,則必須在允許其他寫入器寫入之前終止第一個寫入器。每個寫入器都有自己的控制器來控制流。

此外,可寫流有一個內部佇列,就像可讀流一樣。它還跟蹤已寫入但未由底層接收器處理的塊。

Writable Stream

WritableStream 介面

Stream API 支援三種類型的可寫流介面 -

  • WritableStream 介面

  • WritableStreamDefaultWriter 介面

  • WritableStreamDefaultController 介面

WritableStream 介面

WritableStream 介面用於將流資料寫入接收器。其物件帶有內建的反壓和排隊功能。

建構函式

要建立 WritableStream 物件,WritableStream 介面提供了一個 WritableStream() 建構函式。

語法

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)。

例項屬性

WritableStream 介面提供的屬性是隻讀屬性。因此,WritableStream 提供的屬性為 -

序號 屬性 & 描述
1

WritableStream.locked

此屬性用於檢查 WritableStream 是否被鎖定到寫入器。

方法

以下是 WritableStream 介面常用的方法 -

序號 屬性 & 描述
1

WritableStream.close()

此方法用於關閉流。

2

WritableStream.abort()

此方法用於中止流。

3

WritableStream.getWriter()

此方法用於獲取 WriteableStreamDefaultWriter 的新物件,並將流鎖定到該例項。當流被鎖定後,在當前物件被釋放之前,其他任何寫入器都無法獲取。

WritableStreamDefaultWriter 介面

WritableStreamDefaultWriter 介面用於表示預設寫入器,該寫入器將資料塊寫入流。

建構函式

要建立 WritableStreamDefaultWriter 物件,WritableStreamDefaultWriter 介面提供了一個 WritableStreamDefaultWriter() 建構函式。

語法

const newWrite = new WritableStreamDefaultWriter(myStream)

此建構函式只包含一個引數 myStream。它將讀取 ReadableStream。

例項屬性

WritableStreamDefaultWriter 介面提供的屬性是隻讀屬性。因此,WritableStreamDefaultWriter 提供的屬性為 -

序號 屬性 & 描述
1

WritableStreamDefaultWriter.closed

此屬性返回一個 Promise,如果流已關閉,則解析,如果由於某些錯誤而被拒絕,則拒絕。它允許您建立一個將在流處理結束時做出響應的程式。

2

WritableStreamDefaultWriter.desiredSize

此屬性用於獲取將滿足流內部佇列所需的尺寸。

3

WritableStreamDefaultWriter.ready

此屬性返回一個 Promise,當流內部佇列的所需尺寸從負數轉換為正數時,該 Promise 將被解析。

方法

以下是 WritableStreamDefaultWriter 介面常用的方法 -

序號 方法 & 描述
1

WritableStreamDefaultWriter.abort()

此方法用於中止流。

2

WritableStreamDefaultWriter.close()

此方法用於關閉可寫流。

3

WritableStreamDefaultWriter.releaseLock()

此方法用於刪除寫入器在相應流上的鎖定。

4

WritableStreamDefaultWriter.write()

此方法用於將傳遞的資料塊寫入 WritableStream 及其底層接收器。它將返回一個 Promise,該 Promise 解析以確定寫入操作是失敗還是成功。

WritableStreamDefaultController 介面

WritableStreamDefaultController 介面表示一個控制器,允許我們控制 WritableStream 狀態。它不提供任何控制器,並且在構造 WritableStream 時會自動建立例項。

例項屬性

WritableStreamDefaultController 介面提供的屬性是隻讀屬性。因此,WritableStreamDefaultController 提供的屬性為 -

序號 屬性 & 描述
1

WritableStreamDefaultController.signal

此屬性將返回與指定控制器相關的 AbortSignal。

方法

以下是 WritableStreamDefaultController 介面常用的方法 -

序號 方法 & 描述
1

WritableStreamDefaultController.error()

此方法將導致與相關寫流的任何未來互動都發生錯誤。

示例 - 建立可寫流

在下面的程式中,我們建立了一個自定義可寫流。因此,要建立可寫流,Stream API 提供了 WritableStream() 建構函式以及 write()、cancel() 和 abort() 函式。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>

輸出

Writable Stream

結論

所以這是一個可寫流。藉助可寫流,我們可以輕鬆地將資料寫入資源,而無需將整個資料載入到記憶體中。在下一篇文章中,我們將討論 Stream API 中的變換流。

廣告

© . All rights reserved.