fetch ã¯ãã¦ã³ãã¼ãã®é²è¡ç¶æ³ã追跡ãããã¨ãã§ãã¾ããããã¢ãããã¼ãã®é²è¡ç¶æ³ã®è¿½è·¡ã¯ã§ãã¾ããã
注æãã¦ãã ãã: ç¾å¨ã¢ãããã¼ãã®é²è¡ç¶æ³ãåå¾ããæ¹æ³ã¯ããã¾ããããããããã«ã¯ãXMLHttpRequest ã使ç¨ãã¦ãã ããã
ãã¦ã³ãã¼ãã®é²è¡ç¶æ³ã追跡ããã«ã¯ãresponse.body ããããã£ã使ç¨ãã¾ãããã㯠âèªã¿åãå¯è½ãªã¹ããªã¼ã â ã§ããããã¯ãã£ã³ã¯ãã¨ã«æ¬æãæä¾ããç¹å¥ãªãªãã¸ã§ã¯ããªã®ã§ããã®æç¹ã§ã©ã®ãããå©ç¨ã§ããã®ãã確èªãããã¨ãã§ãã¾ãã
ããã¯ãã¬ã¹ãã³ã¹ãèªã¿è¾¼ãã®ã«ããã使ã£ãã³ã¼ãã®æ¦ç¥ã説æãããã®ã§ãã:
// response.json() ãªã©ã®ä»ã®ã¡ã½ããã®ä»£ãã
const reader = response.body.getReader();
// æ¬æã®ãã¦ã³ãã¼ãã¯ç¡éã«ã¼ã
while(true) {
// æå¾ã®ãã£ã³ã¯ãå ´åãdone 㯠trueã
// value ã¯ãã£ã³ã¯ãã¤ãã® Uint8Array
const {done, value} = await reader.read();
if (done) {
break;
}
console.log(`Received ${value.length} bytes`)
}
await reader.read() ãã¬ã¹ãã³ã¹ã®ãã£ã³ã¯ãè¿ãéãã«ã¼ããã¾ãã
ãã£ã³ã¯ã¯ï¼ã¤ã®ããããã£ãæã£ã¦ãã¾ãã:
doneâ èªã¿è¾¼ã¿ãå®äºãã㨠true ã«ãªãã¾ããvalueâ åä»ãã®ãã¤ãé å:Uint8Array.
é²è¡ç¶æ³ãè¨é²ããã«ã¯ããã£ã³ã¯ãæ°ããå¿ è¦ãããã¾ãã
ããã¯ã¬ã¹ãã³ã¹ãåå¾ããé²è¡ç¶æ³ãè¨é²ããå®å ¨ãªã³ã¼ãã§ãã:
// Step 1: fetch ãéå§ããreader ãåå¾ãã¾ã
let response = await fetch('https://api.github.com/repos/javascript-tutorial/en.javascript.info/commits?per_page=100');
const reader = response.body.getReader();
// Step 2: åè¨ã®é·ããåå¾ãã¾ã
const contentLength = +response.headers.get('Content-Length');
// Step 3: ãã¼ã¿ãèªã¿è¾¼ã¿ã¾ã
let receivedLength = 0; // ãã®æç¹ã®é·ã
let chunks = []; // åä¿¡ãããã¤ããªãã£ã³ã¯ã®é
å(æ¬æãæ§æãã¾ã)
while(true) {
const {done, value} = await reader.read();
if (done) {
break;
}
chunks.push(value);
receivedLength += value.length;
console.log(`Received ${receivedLength} of ${contentLength}`)
}
// Step 4: ãã£ã³ã¯ã1ã¤ã® Uint8Array ã«é£çµãã¾ã
let chunksAll = new Uint8Array(receivedLength); // (4.1)
let position = 0;
for(let chunk of chunks) {
chunksAll.set(chunk, position); // (4.2)
position += chunk.length;
}
// Step 5: æååã«ãã³ã¼ããã¾ã
let result = new TextDecoder("utf-8").decode(chunksAll);
// å®äº!
let commits = JSON.parse(result);
alert(commits[0].author.login);
ã¹ãããæ¯ã®èª¬æã§ã:
-
é常éã
fetchãå®è¡ãã¾ãããresponse.json(), ã®ä»£ããã«response.body.getReader()ãåå¾ãã¾ããæ³¨æãã¦ãã ãããåä¸ã®ã¬ã¹ãã³ã¹ãèªã¿è¾¼ãã®ã«ãããã両æ¹ã®ã¡ã½ããã使ç¨ãããã¨ã¯ã§ãã¾ãããçµæãå¾ãã«ã¯ãreader ã使ç¨ããããã¬ã¹ãã³ã¹ã¡ã½ããã使ç¨ãããã®ããããã§ãã
-
èªã¿è¾¼ãåã«ã
Content-Lengthãããããã¬ã¹ãã³ã¹å ¨ä½ã®é·ããç¥ããã¨ãã§ãã¾ããã¯ãã¹ãã¡ã¤ã³ãªã¯ã¨ã¹ã(ãã£ãã¿ã¼ Fetch: ã¯ãã¹ãªãªã¸ã³(Cross-Origin) ãªã¯ã¨ã¹ã ãåç §)ã®å ´åããããã¯ãªãå ´åãããã¾ããåæ§ã«ãæè¡çã«ã¯ãµã¼ãã¯è¨å®ããå¿ è¦ã¯ããã¾ããããé常ã¯ããã«ããã¾ãã
-
å®äº(done)ããã¾ã§ã
await reader.read()ãå¼ã³åºãã¾ããããã§ã¯é åã«ã¬ã¹ãã³ã¹ã®
chunksãéãã¦ãã¾ãããããã¯éè¦ã§ãããªããªããã¬ã¹ãã³ã¹æ¶è²»å¾ã¯ãresponse.json()ãå¥ã®æ¹æ³ã使ã£ã¦ âåèªã¿åãâ ãããã¨ã¯ã§ããªãããã§ã(ããã¨ã¨ã©ã¼ã«ãªãã¾ã)ã -
æå¾ã«ã
chunksâUint8Arrayãã¤ããã£ã³ã¯ã®é åãï¼ã¤ã®çµæã«çµåããå¿ è¦ãããã¾ããæ®å¿µãªãããããããé£çµããåä¸ã®ã¡ã½ããã¯ãªãã®ã§ãããããã³ã¼ããæ¸ãå¿ è¦ãããã¾ãã:new Uint8Array(receivedLength)â é£çµãããé·ãããã¤ãåãåã®é åã使ãã¾ãã- 次ã«
.set(chunk, position)ã¡ã½ããã§çµæã¨ãªãé åã«åchunkãç¶ã ã¨ã³ãã¼ãã¾ãã
-
chunksAllã«çµæãããã¾ãããããã¯æååã§ã¯ãªããã¤ãé åã§ããæååãä½ãã«ã¯ããããã®ãã¤ããè§£éããå¿ è¦ãããã¾ããçµã¿è¾¼ã¿ã® TextDecoder ã¯ã¾ãã«ãããè¡ãã¾ãããã®å¾ã
JSON.parseãããã¨ãã§ãã¾ãã
仮㫠JSON ã®ä»£ããã«ãã¤ããªã®ã³ã³ãã³ããå¿ è¦ãªå ´åã¯ã©ããªãã§ãããï¼ãã®å ´åã¯ããã·ã³ãã«ã§ããStep 4, 5 ã®ä»£ããã«ããã¹ã¦ã®ãã£ã³ã¯ã® blob ãä½ãã¾ãã
let blob = new Blob(chunks);
ç¹°ãè¿ãã¾ãããããã¯ã¢ãããã¼ãã®é²è¡ç¶æ³ã§ã¯ãªãï¼ä»ã®ã¨ããæ¹æ³ã¯ããã¾ããï¼ããã¦ã³ãã¼ãã®é²è¡ç¶æ³ã«ã¤ãã¦ã®ã¿ã§ãããã¨ã«çæãã¦ãã ããã
ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã