WritableStreamDefaultWriter
注意:此功能在 Web Workers 中可用。
WritableStreamDefaultWriter
是 Streams API 的一个接口,它是由 WritableStream.getWriter()
返回的对象,一旦创建,它就会将编写器锁定到 WritableStream
,确保没有其他流可以写入底层接收器。
构造函数
WritableStreamDefaultWriter()
-
创建一个新的
WritableStreamDefaultWriter
对象实例。
实例属性
WritableStreamDefaultWriter.closed
只读-
允许您编写代码以响应流处理的结束。如果流变为关闭状态,则返回一个完成的 Promise,否则如果流出错或编写器的锁被释放,则返回一个拒绝的 Promise。
WritableStreamDefaultWriter.desiredSize
只读-
返回流的内部队列所需填充的所需大小。
WritableStreamDefaultWriter.ready
只读-
返回一个
Promise
,当流的内部队列的所需大小从非正数变为正数时,该 Promise 会解决,表明它不再应用背压。
实例方法
WritableStreamDefaultWriter.abort()
-
中止流,表明生产者无法再成功写入流,并且流将立即移至错误状态,任何排队的写入将被丢弃。
WritableStreamDefaultWriter.close()
-
关闭关联的可写流。
WritableStreamDefaultWriter.releaseLock()
-
释放编写器对相应流的锁。释放锁后,编写器将不再活动。如果关联的流在锁被释放时出错,则编写器从现在起将以相同的方式显示出错;否则,编写器将显示已关闭。
WritableStreamDefaultWriter.write()
-
将传递的数据块写入
WritableStream
及其底层接收器,然后返回一个Promise
,该 Promise 会解决以表明写入操作的成功或失败。
示例
以下示例展示了使用自定义接收器和 API 提供的排队策略创建 WritableStream
的过程。然后,它调用名为 sendMessage()
的函数,并将新创建的流和一个字符串传递给该函数。在这个函数内部,它调用流的 getWriter()
方法,该方法返回一个 WritableStreamDefaultWriter
实例。forEach()
调用用于将字符串的每个块写入流。最后,write()
和 close()
返回处理块和流的成功或失败的 Promise。
const list = document.querySelector("ul");
async function sendMessage(message, writableStream) {
// defaultWriter is of type WritableStreamDefaultWriter
const defaultWriter = writableStream.getWriter();
const encoder = new TextEncoder();
const encoded = encoder.encode(message);
try {
for (const chunk of encoded) {
await defaultWriter.ready;
await defaultWriter.write(chunk);
console.log("Chunk written to sink.");
}
// Call ready again to ensure that all chunks are written
// before closing the writer.
await defaultWriter.ready;
await defaultWriter.close();
console.log("All chunks written");
} catch (err) {
console.log("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 标准 # default-writer-class |
浏览器兼容性
BCD 表格仅在浏览器中加载