ReadableStream.ReadableStream()
åºçº¿
广æ³å¯ç¨
èª 2020å¹´1æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
ReadableStream() æé 彿°å建并ä»ç»å®çå¤çç¨åºè¿åä¸ä¸ªå¯è¯»çæµå¯¹è±¡ã
è¯æ³
new ReadableStream()
new ReadableStream(underlyingSource)
new ReadableStream(underlyingSource, queuingStrategy)
åæ°
underlyingSourceå¯é-
ä¸ä¸ªå å«å®ä¹äºæé æµè¡ä¸ºæ¹æ³å屿§ç对象ã
underlyingSourceå æ¬ï¼start(controller) å¯é-
è¿æ¯ä¸ä¸ªå½å¯¹è±¡è¢«æé æ¶ç«å»è°ç¨çæ¹æ³ãæ¤æ¹æ³çå 容ç±å¼å人åå®ä¹ï¼å¹¶åºçç¼äºè®¿é®æµï¼å¹¶æ§è¡å ¶ä»ä»»ä½å¿ éç设置æµåè½ã妿è¿ä¸ªè¿ç¨æ¯å¼æ¥å®æçï¼å®å¯ä»¥è¿åä¸ä¸ª promiseï¼è¡¨ææåæå¤±è´¥ãä¼ éç»è¿ä¸ªæ¹æ³ç
controlleræ¯ä¸ä¸ªReadableStreamDefaultControlleræReadableByteStreamControllerï¼å ·ä½åå³äºtype屿§çå¼ãå¼å人åå¯ä»¥ä½¿ç¨æ¤æ¹æ³å¨è®¾ç«æé´æ§å¶æµã pull(controller) å¯é-
è¿ä¸ªæ¹æ³ï¼ä¹æ¯ç±å¼å人åå®ä¹çï¼å½æµçå é¨éå䏿»¡æ¶ï¼ä¼éå¤è°ç¨è¿ä¸ªæ¹æ³ï¼ç´å°éå补满ã妿
pull()è¿åä¸ä¸ª promiseï¼é£ä¹å®å°ä¸ä¼å被è°ç¨ï¼ç´å° promise 宿;妿 promise 失败ï¼è¯¥æµå°ä¼åºç°é误ãä¼ éç»æ¤æ¹æ³çcontrolleråæ°æ¯ReadableStreamDefaultControlleræReadableByteStreamControllerï¼å ·ä½åå³äºtype屿§çå¼ãç±äºæ´å¤çå被è·åï¼è¿ä¸ªæ¹æ³å¯ä»¥è¢«å¼å人åç¨æ¥æ§å¶æµã cancel(reason) å¯é-
妿åºç¨ç¨åºè¡¨ç¤ºè¯¥æµå°è¢«åæ¶ï¼ä¾å¦ï¼è°ç¨äº
ReadableStream.cancel()ï¼åå°è°ç¨æ¤æ¹æ³ï¼è¯¥æ¹æ³ä¹ç±å¼å人åå®ä¹ãè¯¥æ¹æ³åºè¯¥åä»»ä½å¿ è¦çäºæ æ¥éæ¾å¯¹æµç访é®ã 妿è¿ä¸ªè¿ç¨æ¯å¼æ¥çï¼å®å¯ä»¥è¿åä¸ä¸ª promiseï¼è¡¨ææåæå¤±è´¥ãåå åæ°å å«ä¸ä¸ªStringï¼å®æè¿°äºæµè¢«åæ¶çåå ã typeå¯é-
è¯¥å±æ§æ§å¶æ£å¨å¤ççå¯è¯»ç±»åçæµã妿å®å å«ä¸ä¸ªè®¾ç½®ä¸º
bytesçå¼ï¼åä¼ éçæ§å¶å¨å¯¹è±¡å°æ¯ä¸ä¸ªReadableByteStreamControllerï¼è½å¤å¤ç BYOBï¼å¸¦ä½ èªå·±çç¼å²åºï¼/åèæµã妿æªå å«ï¼åä¼ éçæ§å¶å¨å°ä¸ºReadableStreamDefaultControllerã autoAllocateChunkSizeå¯é-
对äºåèæµï¼å¼å人åå¯ä»¥ä½¿ç¨æ£æ´æ°å¼è®¾ç½®
autoAllocateChunkSize以æå¼æµçèªå¨åé åè½ãå¯ç¨æ¤åè½åï¼æµå®ç°å°èªå¨åé ä¸ä¸ªå ·æç»å®æ´æ°å¤§å°çArrayBufferï¼å¹¶è°ç¨åºå±æºä»£ç ï¼å°±å¥½åæ¶è´¹è æ£å¨ä½¿ç¨ BYOB reader 䏿 ·ã
queuingStrategyå¯é-
ä¸ä¸ªå¯éæ©å®ä¹æµçéåçç¥ç对象ãè¿éè¦ä¸¤ä¸ªåæ°ï¼
highWaterMark-
éè´æ´æ° - è¿å®ä¹äºå¨åºç¨èåä¹åå¯ä»¥å å«å¨å é¨éåä¸çåçæ»æ°ã
size(chunk)-
å å«åæ°
chunkçæ¹æ³ââè¿è¡¨ç¤ºæ¯ä¸ªåå使ç¨ç大å°ï¼ä»¥åè为åä½ï¼ã
夿³¨ï¼ä½ å¯ä»¥èªå®ä¹
queuingStrategyï¼æè 使ç¨ByteLengthQueueingStrategyæCountQueueingStrategyç示ä¾ä½ä¸ºå¯¹è±¡çå¼ã妿 没ææä¾queuingStrategyï¼åé»è®¤å¼ä¸ highWaterMark 为 1 çCountQueuingStrategyç¸åã
è¿åå¼
ReadableStream 对象çå®ä¾ã
å¼å¸¸
- RangeError
-
æä¾ç弿¢ä¸æ¯
"bytes"ä¹ä¸æ¯undefinedã
示ä¾
å¨ä¸é¢çç®å示ä¾ä¸ï¼ä½¿ç¨æé 彿°å建äºä¸ä¸ªèªå®ä¹ç ReadableStreamï¼å®æ´ä»£ç 请åè§æä»¬çç®åéæºæµç¤ºä¾ï¼ãstart() 彿°æ¯ç§çæä¸ä¸ªéæºçææ¬å符串并å°å®æå
¥æµä¸ã妿å 为任ä½åå è°ç¨ ReadableStream.cancel()ï¼è¯¥ cancel() 彿°ä¹å¯ä»¥åæ¢çæå符串ã
æä¸æé®ï¼å°åæ¢çæå符串ï¼ä½¿ç¨ ReadableStreamDefaultController.close() å
³éæµï¼å¹¶ä¸å°è¿è¡å¦ä¸ä¸ªå½æ°ï¼ä»æµä¸è¯»åæ°æ®ã
const stream = new ReadableStream({
start(controller) {
interval = setInterval(() => {
let string = randomChars();
// Add the string to the stream
controller.enqueue(string);
// show it on the screen
let listItem = document.createElement("li");
listItem.textContent = string;
list1.appendChild(listItem);
}, 1000);
button.addEventListener("click", function () {
clearInterval(interval);
fetchStream();
controller.close();
});
},
pull(controller) {
// We don't really need a pull in this example
},
cancel() {
// This is called if the reader cancels,
// so we should stop generating strings
clearInterval(interval);
},
});
è§è
| è§è |
|---|
| Streams > # ref-for-rs-constructor⤠> |