TransformStreamDefaultController
åºçº¿
广æ³å¯ç¨
èª 2022å¹´6æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
Stream API ç TransformStreamDefaultController æ¥å£æä¾äºæä½å
³èç ReadableStream å WritableStream çæ¹æ³ã
彿é TransformStream æ¶ï¼ä¼å建ä¸ä¸ª TransformStreamDefaultControllerãå æ¤å®æ²¡ææé 彿°ãè·å TransformStreamDefaultController å®ä¾çæ¹å¼æ¯éè¿ TransformStream() çåè°æ¹æ³ã
å®ä¾å±æ§
TransformStreamDefaultController.desiredSizeåªè¯»-
è¿åå¡«å æ»¡æµå é¨éåçå¯è¯»ç«¯æéè¦ç大å°ã
å®ä¾æ¹æ³
TransformStreamDefaultController.enqueue()-
æå ¥ä¸ä¸ªååï¼åä¸ªæ°æ®ï¼å°æµçå¯è¯»ç«¯ã
TransformStreamDefaultController.error()-
è½¬æ¢æµçå¯å端åå¯è¯»ç«¯é½åºç°é误ã
TransformStreamDefaultController.terminate()-
å ³éæµçå¯è¯»ç«¯å¹¶ä¸æµçå¯å端åºéã
示ä¾
å¨ä¸é¢ç示ä¾ä¸ï¼ä¸ä¸ªè½¬æ¢æµæ¥æ¶ææçååå°å
¶è½¬æ¢ä¸º Uint8Arrayï¼ä½¿ç¨äº error() å enqueue() æ¹æ³ã
const transformContent = {
start() {}, // required.
async transform(chunk, controller) {
chunk = await chunk;
switch (typeof chunk) {
case "object":
// just say the stream is done I guess
if (chunk === null) controller.terminate();
else if (ArrayBuffer.isView(chunk))
controller.enqueue(
new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength),
);
else if (
Array.isArray(chunk) &&
chunk.every((value) => typeof value === "number")
)
controller.enqueue(new Uint8Array(chunk));
else if (
"function" === typeof chunk.valueOf &&
chunk.valueOf() !== chunk
)
this.transform(chunk.valueOf(), controller); // hack
else if ("toJSON" in chunk)
this.transform(JSON.stringify(chunk), controller);
break;
case "symbol":
controller.error("Cannot send a symbol as a chunk part");
break;
case "undefined":
controller.error("Cannot send undefined as a chunk part");
break;
default:
controller.enqueue(this.textencoder.encode(String(chunk)));
break;
}
},
flush() {
/* do any destructor work here */
},
};
class AnyToU8Stream extends TransformStream {
constructor() {
super({ ...transformContent, textencoder: new TextEncoder() });
}
}
è§è
| è§è |
|---|
| Streams> # ts-default-controller-class> |