WritableStream
åºçº¿
广æ³å¯ç¨
*
èª 2022å¹´5æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
* æ¤ç¹æ§çæäºé¨åçæ¯æç¨åº¦å¯è½ææä¸åã
Stream API ç WritableStream æ¥å£ä¸ºå°æµæ°æ®åå
¥ç®çå°ï¼ç§°ä¸ºæ¥æ¶å¨ï¼æä¾äºä¸ä¸ªæ åçæ½è±¡ã该对象带æå
ç½®çèååéåã
WritableStream æ¯ä¸ä¸ªå¯è½¬ç§»å¯¹è±¡ã
æé 彿°
WritableStream()-
åé ä¸ä¸ªæ°ç
WritableStream对象ã
å®ä¾å±æ§
WritableStream.lockedåªè¯»-
ä¸ä¸ªå¸å°å¼ï¼è¡¨ç¤º
WritableStreamæ¯å¦éå®å°ä¸ä¸ª writerã
å®ä¾æ¹æ³
WritableStream.abort()-
䏿¢æµï¼ä½¿å¾ç产è ä¸è½åæååæµåå ¥æ°æ®ï¼ä¼ç«å»è¿åä¸ä¸ªéè¯¯ç¶æï¼ï¼å¹¶ä¸¢å¼ææå·²å ¥éçæ°æ®ã
WritableStream.close()-
å ³éæµã
WritableStream.getWriter()-
è¿åä¸ä¸ªæ°ç
WritableStreamDefaultWriterå®ä¾å¹¶ä¸å°æµéå®å°è¯¥å®ä¾ã彿µè¢«é宿¶ï¼ç´å°è¿ä¸ªæµè¢«éæ¾ä¹åï¼ä¸è½è·åå ¶ä» writerã
示ä¾
ä¸é¢çä¾å说æäºè¿ä¸ªæ¥å£çå 个åè½ãå®å±ç¤ºäºä½¿ç¨èªå®ä¹ sink åç± API æä¾çéåçç¥å建ç WritableStreamãç¶åå®è°ç¨ä¸ä¸ª sendMessage() ç彿°ï¼ä¼ éæ°åå»ºçæµåä¸ä¸ªå符串ãå¨è¿ä¸ªå½æ°å
é¨ï¼å®è°ç¨æµç getWriter() æ¹æ³ï¼è¯¥æ¹æ³è¿åä¸ä¸ª WritableStreamDefaultWriter å®ä¾ãforEach() ç¨äºå°åç¬¦ä¸²çæ¯ä¸ªåååå
¥æµãæåï¼write() å close() æ¹æ³é½ä¼è¿å promiseï¼promise çç¶æç±å¯¹åºçæä½æ¯å¦æåæ¥å³å®ã
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, { stream: true });
encoded.forEach((chunk) => {
defaultWriter.ready
.then(() => {
return 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) => {
var buffer = new ArrayBuffer(1);
var view = new Uint8Array(buffer);
view[0] = chunk;
var decoded = decoder.decode(view, { stream: true });
var listItem = document.createElement("li");
listItem.textContent = "Chunk decoded: " + decoded;
list.appendChild(listItem);
result += decoded;
resolve();
});
},
close() {
var listItem = document.createElement("li");
listItem.textContent = "[MESSAGE RECEIVED] " + result;
list.appendChild(listItem);
},
abort(err) {
console.log("Sink error:", err);
},
},
queuingStrategy,
);
sendMessage("Hello, world.", writableStream);
ä½ å¯ä»¥å¨æä»¬çç®åç writer ç¤ºä¾æ¾å°å®æ´ä»£ç ã
èå
ç±äº API æ¯æèåçæ¹å¼ï¼å ¶å¨ä»£ç ä¸çå®ç°ï¼å¯è½ä¸å¤ªææ¾ãè¦äºè§£è忝å¦ä½å®ç°çï¼è¯·æ³¨æä»¥ä¸ä¸ç¹ï¼
- 为å建计æ°çç¥ï¼ç¬¬ 35 è¡ï¼è设置ç
highWaterMark屿§ï¼å ¶ç¨äºè®¾ç½®WritableStreamå®ä¾å¤çå个write()æä½æ¶å¯æ¥åçæå¤§æ°æ®éãå¨è¯¥ç¤ºä¾ä¸ï¼å®æ¯å¯ä»¥ä¼ éç»defaultWriter.write()çæå¤§æ°æ®éï¼ç¬¬ 11 è¡ï¼ã defaultWriter.ready屿§è¿åä¸ä¸ªå½ sinkï¼WritableStreamæé 彿°ç第ä¸ä¸ªå±æ§ï¼å®æåå ¥æ°æ®æ¶å ç°ç promiseãæ°æ®æºå¯ä»¥åå ¥æ´å¤çæ°æ®ï¼ç¬¬ 9 è¡ï¼æè è°ç¨close()ï¼ç¬¬ 24 è¡ï¼ãè¿æ©è°ç¨ close() ä¼é»æ¢æ°æ®åå ¥ãè¿å°±æ¯ç¤ºä¾è°ç¨defaultWriter.ready两次çåå ï¼ç¬¬ 9 è¡å第 22 è¡ï¼ã- æ¥æ¶å¨ç
write()æ¹æ³ï¼ç¬¬ 40 è¡ï¼è¿åçPromiseåè¯WritableStreamåå®ç writer 使¶å»å ç°defaultWriter.readyã
è§è
| è§è |
|---|
| Streams > # ws-class > |
æµè§å¨å ¼å®¹æ§
åè§
- WHATWG Stream Visualizerï¼ç¨äºå¯è¯»ãå¯ååè½¬æ¢æµçåºæ¬å¯è§åã