WritableStreamDefaultWriter: close() 方法
注意:此功能在 Web Workers 中可用。
close() 方法是 WritableStreamDefaultWriter 介面的一部分,用於關閉關聯的可寫流。
底層接收器(sink)將完成處理任何先前已寫入的資料塊,然後才會呼叫關閉行為。在此期間,任何進一步的寫入嘗試都將失敗(但不會導致流出錯)。
語法
js
close()
引數
無。
返回值
一個 Promise,如果所有剩餘的資料塊在關閉前都已成功寫入,則會以 undefined fulfilled,如果在此過程中遇到任何問題,則會以錯誤 reject。
異常
TypeError-
您嘗試關閉的流不是
WritableStream。
示例
以下示例展示瞭如何建立一個具有自定義接收器(sink)和 API 提供的排隊策略的 WritableStream。然後,它呼叫一個名為 sendMessage() 的函式,並將新建立的流和一個字串作為引數傳遞。在此函式內部,它呼叫流的 getWriter() 方法,該方法返回一個 WritableStreamDefaultWriter 例項。使用 write() 方法將編碼字串的每個資料塊寫入流,並使用編碼後的 Uint8Array 的 forEach() 方法逐位元組處理。最後,呼叫 close() 方法,並處理它返回的 Promise,以應對分塊寫入操作的成功(或任何失敗)。
js
const list = document.querySelector("ul");
function sendMessage(message, writableStream) {
// defaultWriter is of type WritableStreamDefaultWriter
const defaultWriter = writableStream.getWriter();
const encoder = new TextEncoder();
const encoded = encoder.encode(message);
encoded.forEach((chunk) => {
defaultWriter.ready
.then(() => {
defaultWriter.write(chunk);
})
.then(() => {
console.log("Chunk written to sink.");
})
.catch((err) => {
console.log("Chunk error:", err);
});
});
// Call ready again to ensure that all chunks are written
// before closing the writer.
defaultWriter.ready
.then(() => {
defaultWriter.close();
})
.then(() => {
console.log("All chunks written");
})
.catch((err) => {
console.log("Stream error:", err);
});
}
const decoder = new TextDecoder("utf-8");
const queuingStrategy = new CountQueuingStrategy({ highWaterMark: 1 });
let result = "";
const writableStream = new WritableStream(
{
// Implement the sink
write(chunk) {
return new Promise((resolve, reject) => {
const buffer = new ArrayBuffer(1);
const view = new Uint8Array(buffer);
view[0] = chunk;
const decoded = decoder.decode(view, { stream: true });
const listItem = document.createElement("li");
listItem.textContent = `Chunk decoded: ${decoded}`;
list.appendChild(listItem);
result += decoded;
resolve();
});
},
close() {
const listItem = document.createElement("li");
listItem.textContent = `[MESSAGE RECEIVED] ${result}`;
list.appendChild(listItem);
},
abort(err) {
console.log("Sink error:", err);
},
},
queuingStrategy,
);
sendMessage("Hello, world.", writableStream);
您可以在我們的 簡單的寫入器示例 中檢視此內容的即時演示。
規範
| 規範 |
|---|
| Streams # ref-for-default-writer-close⑦ |
瀏覽器相容性
載入中…