WritableStreamDefaultWriter: close() 方法
注意:此功能在 Web Workers 中可用。
close()
方法是 WritableStreamDefaultWriter
接口的一部分,用于关闭关联的可写流。
在调用关闭行为之前,底层接收器将完成对之前写入的所有块的处理。在此期间,任何进一步的写入尝试都将失败(不会导致流出错)。
语法
js
close()
参数
无。
返回值
一个 Promise
,如果在关闭之前成功写入所有剩余的块,则该 Promise 将使用 undefined
完成,如果在处理过程中遇到问题,则该 Promise 将使用错误拒绝。
异常
TypeError
-
您尝试关闭的流不是
WritableStream
。
示例
以下示例展示了使用自定义接收器和 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⑦ |
浏览器兼容性
BCD 表仅在浏览器中加载