WritableStreamDefaultWriter - 表示 WritableStream.getWriter() 返回的对象
这是一个实验中的功能
此功能某些浏览器尚在开发中,请参考浏览器兼容性表格以得到在不同浏览器中适合使用的前缀。由于该功能对应的标准文档可能被重新修订,所以在未来版本的浏览器中该功能的语法和行为可能随之改变。
WritableStreamDefaultWriter
是 Streams API 的接口,表示 WritableStream.getWriter()
返回的对象,创建后,将写入器锁定到 WritableStream
,以确保其他任何流都无法写入基础接收器。
构造函数
WritableStreamDefaultWriter()
创建一个新的 WritableStreamDefaultWriter
对象实例。
属性
WritableStreamDefaultWriter.closed
只读
允许您编写响应流式传输过程结束的代码。返回一个承诺,该承诺在流关闭或释放写入器的锁时实现,或者在流错误时拒绝。
WritableStreamDefaultWriter.desiredSize
只读
返回填充流的内部队列所需的大小。
WritableStreamDefaultWriter.ready
只读
返回一个 Promise
,当流的内部队列的所需大小从非正向正向转变时,将进行解析,表示不再使用反压。
方法
WritableStreamDefaultWriter.abort()
中止该流,表明生产者无法再成功写入该流,并且应立即将其移至错误状态,并丢弃所有排队的写操作。
WritableStreamDefaultWriter.close()
关闭关联的可写流。
WritableStreamDefaultWriter.releaseLock()
释放写入器在相应流上的锁定。释放锁定后,写入器不再处于活动状态。如果释放锁时关联的流出错,则从现在开始,写入器将一直返回同样的错误;否则,写入器将会关闭。
WritableStreamDefaultWriter.write()
将传递的数据块写入 WritableStream
及其基础接收器,然后返回一个 Promise
,该数据解析为指示写操作的成功或失败。
实例
以下实例说明了此接口的一些功能。它显示了使用自定义接收器和 API 提供的排队策略创建 WritableStream
的过程。然后,它调用一个名为 sendMessage()
的函数,传递新创建的流和一个字符串。在此函数内,它调用流的 getWriter()
方法,该方法返回一个 WritableStreamDefaultWriter
的实例。接着调用 forEach()
将字符串的每个块写入流中。最后,write()
和 close()
返回处理块和流为成功或失败的承诺。
const list = document.querySelector('ul');
function sendMessage(message, writableStream) {
// defaultWriter 的类型为 WritableStreamDefaultWriter
const defaultWriter = writableStream.getWriter();
const encoder = new TextEncoder();
const encoded = encoder.encode(message, { stream: true });
encoded.forEach((chunk) => {
defaultWriter.ready
.then(() => {
return defaultWriter.write(chunk);
})
.then(() => {
console.log("块写入接收器。");
})
.catch((err) => {
console.log("块错误:", err);
});
});
// 在关闭写入器之前,再次调用就绪以确保所有块均已写入。
defaultWriter.ready
.then(() => {
defaultWriter.close();
})
.then(() => {
console.log("所有的块已写入。");
})
.catch((err) => {
console.log("流错误:", err);
});
}
const decoder = new TextDecoder("utf-8");
const queuingStrategy = new CountQueuingStrategy({ highWaterMark: 1 });
let result = "";
const writableStream = new WritableStream({
// 实现接收器
write(chunk) {
return new Promise((resolve, reject) => {
var buffer = new ArrayBuffer(2);
var view = new Uint16Array(buffer);
view[0] = chunk;
var decoded = decoder.decode(view, { stream: true });
var listItem = document.createElement('li');
listItem.textContent = "块解码:" + decoded;
list.appendChild(listItem);
result += decoded;
resolve();
});
},
close() {
var listItem = document.createElement('li');
listItem.textContent = "[收到消息] " + result;
list.appendChild(listItem);
},
abort(err) {
console.log("接收器错误:", err);
}
}, queuingStrategy);
sendMessage("Hello, world.", writableStream);
您可以在我们的简单写入器实例中找到完整的代码。
规范
规范 | 状态 | 备注 |
---|---|---|
Streams WritableStreamDefaultWriter 的定义 |
现行的标准 | 初始定义。 |
桌面浏览器兼容性
特性 | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
基础支持 | 59 | 16 | 不支持 | 不支持 | 46 | 未知 |
WritableStreamDefaultWriter() 构造函数 | 59 | 16 | 不支持 | 不支持 | 46 | 未知 |
abort | 59 | 16 | 不支持 | 不支持 | 46 | 未知 |
close | 59 | 16 | 不支持 | 不支持 | 46 | 未知 |
closed | 59 | 16 | 不支持 | 不支持 | 46 | 未知 |
desiredSize | 59 | 16 | 不支持 | 不支持 | 46 | 未知 |
ready | 59 | 16 | 不支持 | 不支持 | 46 | 未知 |
releaseLock | 59 | 16 | 不支持 | 不支持 | 46 | 未知 |
write | 59 | 16 | 不支持 | 不支持 | 46 | 未知 |
移动浏览器兼容性
特性 | Android | Chrome for Android | Edge mobile | Firefox for Android | IE mobile | Opera Android | iOS Safari |
---|---|---|---|---|---|---|---|
基础支持 | 59 | 59 | 未知 | 不支持 | 未知 | 43 | 未知 |
WritableStreamDefaultWriter() 构造函数 | 59 | 59 | 未知 | 不支持 | 未知 | 43 | 未知 |
abort | 59 | 59 | 未知 | 不支持 | 未知 | 43 | 未知 |
close | 59 | 59 | 未知 | 不支持 | 未知 | 43 | 未知 |
closed | 59 | 59 | 未知 | 不支持 | 未知 | 43 | 未知 |
desiredSize | 59 | 59 | 未知 | 不支持 | 未知 | 43 | 未知 |
ready | 59 | 59 | 未知 | 不支持 | 未知 | 43 | 未知 |
releaseLock | 59 | 59 | 未知 | 不支持 | 未知 | 43 | 未知 |
write | 59 | 59 | 未知 | 不支持 | 未知 | 43 | 未知 |