ReadableStream: ReadableStream() ã³ã³ã¹ãã©ã¯ã¿ã¼
Baseline
åºãå©ç¨å¯è½
ãã®æ©è½ã¯åºãå®è£ ããã¦ãããå¤ãã®ãã¼ã¸ã§ã³ã®ç«¯æ«ããã©ã¦ã¶ã¼ã§åä½ãã¾ãã2020å¹´1æä»¥éããã¹ã¦ã®ãã©ã¦ã¶ã¼ã§å©ç¨å¯è½ã§ãã
ReadableStream() ã³ã³ã¹ãã©ã¯ã¿ã¼ã¯ãæå®ããããã³ãã©ã¼ããèªã¿åãå¯è½ãªã¹ããªã¼ã ã®ãªãã¸ã§ã¯ãã使ãã¦è¿ãã¾ãã
ãã¹ã¦ã®å¼æ°ã¯æè¡çã«ãªãã·ã§ã³ã§ããã underlyingSource ãçç¥ããã¨ãã½ã¼ã¹ãæããªãã¹ããªã¼ã ã«ãªããããããèªã¿è¾¼ããã¨ãã§ããªããªããã¨ã«æ³¨æãã¦ãã ããï¼ãªã¼ãã¼ã¯æ±ºãã¦è§£æ±ºãããªããããã¹ãè¿ãã¾ãï¼ã
æ§æ
new ReadableStream()
new ReadableStream(underlyingSource)
new ReadableStream(underlyingSource, queuingStrategy)
弿°
underlyingSourceçç¥å¯-
æ§ç¯ãããã¹ããªã¼ã ã®ã¤ã³ã¹ã¿ã³ã¹ã®åä½ãå®ç¾©ããã¡ã½ããã¨ããããã£ãå«ããªãã¸ã§ã¯ãã
underlyingSourceã«ã¯æ¬¡ã®ãã®ãå«ãããã¨ãã§ãã¾ããstart(controller) çç¥å¯-
ããã¯ããªãã¸ã§ã¯ããæ§ç¯ãããã¨ããã«å¼ã³åºãããã¡ã½ããã§ãã ãã®ã¡ã½ããã®å 容ã¯éçºè ãå®ç¾©ããã¹ããªã¼ã ã®ã½ã¼ã¹ã¸ã®ã¢ã¯ã»ã¹ãåå¾ããã¹ããªã¼ã æ©è½ãè¨å®ããããã«å¿ è¦ãªä»ã®ãã¹ã¦ã®æä½ãè¡ãå¿ è¦ãããã¾ãã ãã®ããã»ã¹ãéåæã§å®è¡ããå ´åãæåã¾ãã¯å¤±æãéç¥ãããããã¹ãè¿ããã¨ãã§ãã¾ãããã®ã¡ã½ããã«æ¸¡ããã
controller弿°ã¯ãReadableStreamDefaultControllerã¾ãã¯ReadableByteStreamControllerãtypeããããã£ã®å¤ã«å¿ãã¦æå®ãã¾ããéçºè ã¯ããã使ç¨ãã¦ãã»ããã¢ããä¸ã«ã¹ããªã¼ã ãå¶å¾¡ã§ãã¾ãã pull(controller) çç¥å¯-
ãã®ã¡ã½ããã¯ãéçºè ãå®ç¾©ããã¹ããªã¼ã ã®å é¨ã«ãããã£ã³ã¯ã®ãã¥ã¼ããã£ã±ãã«ãªã£ã¦ããªãå ´åãæé«æ°´æºç¹ã«éããã¾ã§ç¹°ãè¿ãå¼ã³åºããã¾ãã
pull()ããããã¹ãè¿ãå ´åããã®ãããã¹ãæºããããã¾ã§åã³å¼ã³åºããã¾ããããããã¹ãæå¦ãããå ´åãã¹ããªã¼ã ã¯ã¨ã©ã¼ã«ãªãã¾ãããã®ã¡ã½ããã«æ¸¡ãããcontroller弿°ã¯ãReadableStreamDefaultControllerã¾ãã¯ReadableByteStreamControllerãtypeããããã£ã®å¤ã«å¿ãã¦æå®ãã¾ããéçºè ã¯ããã使ç¨ãã¦ãããå¤ãã®ãã£ã³ã¯ãèªã¿åãããããã¹ããªã¼ã ãå¶å¾¡ã§ãã¾ãããã®é¢æ°ã¯start()ãå®å ¨ã«çµäºããã¾ã§å¼ã³åºããã¾ãããããã«ããã®é¢æ°ã¯å°ãªãã¨ãä¸ã¤ã®ãã£ã³ã¯ããã¥ã¼ã«å ¥ããããããBYOB ãªã¯ã¨ã¹ããå±¥è¡ãããå ´åã«ã®ã¿ç¹°ãè¿ãå¼ã³åºããã¾ãã cancel(reason) çç¥å¯-
ãã®ã¡ã½ããã¯ãéçºè ãå®ç¾©ããã¹ããªã¼ã ããã£ã³ã»ã«ããããã¨ãã¢ããªãéç¥ããå ´åã«å¼ã³åºããã¾ãï¼ä¾ãã°ã
ReadableStream.cancel()ãå¼ã³åºãããå ´åï¼ã å 容ã¯ãã¹ããªã¼ã ã®ã½ã¼ã¹ã¸ã®ã¢ã¯ã»ã¹ãè§£æ¾ããããã«å¿ è¦ãªãã¨ãè¡ãå¿ è¦ãããã¾ãã ãã®ããã»ã¹ãéåæã®å ´åãæåã¾ãã¯å¤±æãéç¥ãããããã¹ãè¿ããã¨ãã§ãã¾ããreason弿°ã«ã¯ãã¹ããªã¼ã ããã£ã³ã»ã«ãããçç±ã説æããæååãå«ã¾ãã¦ãã¾ãã typeçç¥å¯-
ãã®ããããã£ã¯ãã©ã®ç¨®é¡ã®èªã¿åãå¯è½ãªã¹ããªã¼ã ãå¦çãããããå¶å¾¡ãã¾ãã
"bytes"ã«è¨å®ãããå¤ãå«ã¾ãã¦ããå ´åãæ¸¡ãããã³ã³ããã¼ã©ã¼ãªãã¸ã§ã¯ãã¯ã BYOB ï¼ç¬èªã®ãããã¡ã¼ãæã¡è¾¼ãï¼/ãã¤ãã¹ããªã¼ã ãå¦çã§ããReadableByteStreamControllerã«ãªãã¾ãã å«ã¾ãã¦ããªãå ´åãæ¸¡ãããã³ã³ããã¼ã©ã¼ã¯ReadableStreamDefaultControllerã«ãªãã¾ãã autoAllocateChunkSizeçç¥å¯-
ãã¤ãã¹ããªã¼ã ã®å ´åãéçºè ã¯
autoAllocateChunkSizeã«æ£ã®æ´æ°å¤ãè¨å®ãã¦ãã¹ããªã¼ã ã®èªåå²ãå½ã¦æ©è½ããªã³ã«ã§ãã¾ãã ãããè¨å®ããã¨ãã¹ããªã¼ã ã®å®è£ ã¯ãå¿ è¦ãªã¨ãã«èªåçã«ReadableByteStreamController.byobRequestã«æå®ãããµã¤ãºã®ãã¥ã¼ãããã¡ã¼ã確ä¿ããããã«ãªãã¾ããæ¢å®ã®
ReadableStreamDefaultReaderã§ã¼ãã³ãã¼è»¢éã使ç¨ããããã«ã¯ããã®è¨å®ãããªããã°ãªãã¾ããã è¨å®ããã¦ããªãå ´åãæ¢å®ã®ãªã¼ãã¼ã¯ãã¼ã¿ãã¹ããªã¼ã ãã¾ãããReadableByteStreamController.byobRequestã¯å¸¸ã«nullã¨ãªããã³ã³ã·ã¥ã¼ãã¼ã¸ã®è»¢éã¯ã¹ããªã¼ã å ã®ãã¥ã¼ãçµç±ããªããã°ãªãã¾ããã
queuingStrategyçç¥å¯-
ãªãã·ã§ã³ã§ã¹ããªã¼ã ã®ãã¥ã¼ã¤ã³ã°æ¦ç¥ãå®ç¾©ãããªãã¸ã§ã¯ãã ããã«ã¯æ¬¡ã® 2 ã¤ã®å¼æ°ãå¿ è¦ã§ãã
highWaterMark-
è² ã§ãªãæ´æ° â ããã¯ãããã¯ãã¬ãã·ã£ã¼ãé©ç¨ãããåã«å é¨ãã¥ã¼ã«å«ãããã¨ãã§ãããã£ã³ã¯ã®ç·æ°ãå®ç¾©ãã¾ãã
size(chunk)-
弿°
chunkãå«ãã¡ã½ãã â ããã¯ãåãã£ã³ã¯ã«ä½¿ç¨ãããµã¤ãºããã¤ãåä½ã§ç¤ºãã¾ãã
ã¡ã¢: ç¬èªã®ã«ã¹ã¿ã
queuingStrategyãå®ç¾©ãããããã®ãªãã¸ã§ã¯ãå¤ã«ByteLengthQueuingStrategyã¾ãã¯CountQueuingStrategyã®ã¤ã³ã¹ã¿ã³ã¹ã使ç¨ã§ãã¾ããqueuingStrategyãæå®ããã¦ããªãå ´åã使ç¨ãããæ¢å®å¤ã¯ãæé«æ°´æºç¹ã 1 ã®CountQueuingStrategyã¨åãã§ãã
è¿å¤
ReadableStream ãªãã¸ã§ã¯ãã®ã¤ã³ã¹ã¿ã³ã¹ã
ä¾å¤
RangeError-
æå®ããã
typeå¤ãã"bytes"ã§ãundefinedã§ããªãå ´åã«çºçãã¾ãã
ä¾
次ã®åç´ãªä¾ã§ã¯ãã³ã³ã¹ãã©ã¯ã¿ã¼ã使ç¨ãã¦ç¬èªã® ReadableStream ã使ãã¾ãï¼å®å
¨ãªã³ã¼ãã«ã¤ãã¦ã¯ãåç´ãªã©ã³ãã ã¹ããªã¼ã ã®ä¾ãåç
§ï¼ã start() 颿°ã¯ã1 ç§ãã¨ã«ã©ã³ãã ãªããã¹ãæååãçæãããããã¹ããªã¼ã ã®ãã¥ã¼ã«å
¥ãã¾ãã ReadableStream.cancel() ãä½ããã®çç±ã§å¼ã³åºãããå ´åãçæã忢ããããã« cancel() 颿°ãæä¾ãã¾ãã
ãã¿ã³ãæ¼ãã¨ãçæã忢ããReadableStreamDefaultController.close() ã使ç¨ãã¦ã¹ããªã¼ã ãéããã¹ããªã¼ã ãããã¼ã¿ãèªã¿åãå¥ã®é¢æ°ãå®è¡ãã¾ãã
const stream = new ReadableStream({
start(controller) {
interval = setInterval(() => {
let string = randomChars();
// ã¹ããªã¼ã ã«æååã追å
controller.enqueue(string);
// ãããç»é¢ã«è¡¨ç¤º
let listItem = document.createElement("li");
listItem.textContent = string;
list1.appendChild(listItem);
}, 1000);
button.addEventListener("click", () => {
clearInterval(interval);
fetchStream();
controller.close();
});
},
pull(controller) {
// ãã®ä¾ã§ã¯å®éã«ã¯ pull ã¯å¿
è¦ããã¾ãã
},
cancel() {
// ãªã¼ãã¼ããã£ã³ã»ã«ãããå ´åã«å¼ã³åºãããããã
// æååã®çæã忢ããå¿
è¦ãããã¾ã
clearInterval(interval);
},
});
仿§æ¸
| 仿§æ¸ |
|---|
| Streams > # ref-for-rs-constructor⤠> |