fetch ã䏿¢ããã®ã¯å°ãé¢åã§ããæãåºãã¦ãã ãããfetch 㯠promise ãè¿ãã¾ããããã¦ãJavaScript ã«ã¯ä¸è¬çã« promise ã â䏿¢ããâ ã¨ããæ¦å¿µã¯ããã¾ãããã§ã¯ãã©ããã£ã¦ fetch ããã£ã³ã»ã«ãã¾ãããï¼
ãã®ãããªç®çã®ããã®ãç¹å¥ãªçµã¿è¾¼ã¿ã®ãªãã¸ã§ã¯ããããã¾ãã:
AbortController.
ä½¿ãæ¹ã¯ã¨ã¦ãç°¡åã§ã:
-
Step 1: ã³ã³ããã¼ã©ã使ãã¾ã:
let controller = new AbortController();ã³ã³ããã¼ã©ã¯é常ã«ã·ã³ãã«ãªãªãã¸ã§ã¯ãã§ããåä¸ã®ã¡ã½ãã
abort()ã¨ãåä¸ã®ããããã£signalãæã£ã¦ãã¾ããabort()ãå¼ã°ããã¨ãabortã¤ãã³ããcontroller.signalã§çºçãã¾ãã:ãã®ããã«ãªãã¾ã:
let controller = new AbortController(); let signal = controller.signal; // controller.abort() ãå¼ã°ããã¨ããªã¬ã¼ãã¾ã signal.addEventListener('abort', () => alert("abort!")); controller.abort(); // abort! alert(signal.aborted); // true (abort å¾) -
Step 2:
signalããããã£ãfetchãªãã·ã§ã³ã«æ¸¡ãã¾ã:let controller = new AbortController(); fetch(url, { signal: controller.signal });ããã§
fetch㯠signal ããªãã¹ã³ãã¾ãã -
Step 3: 䏿¢ããããã«
controller.abort()ãå¼ã³ã¾ã:controller.abort();ããã§çµããã§ã:
fetchã¯signalããã®ã¤ãã³ããå¾ã¦ããªã¯ã¨ã¹ãã䏿¢ãã¾ãã
fetch ã䏿¢ãããã¨ãããã® promise 㯠AbortError ã¨ããååã®ã¨ã©ã¼ã§ reject ããã¾ãããªã®ã§ã次ã®ããã«å¦çã§ãã¾ã:
// 1ç§ã§ä¸æ¢
let controller = new AbortController();
setTimeout(() => controller.abort(), 1000);
try {
let response = await fetch('/article/fetch-abort/demo/hang', {
signal: controller.signal
});
} catch(err) {
if (err.name == 'AbortError') { // abort() ãå¦ç
alert("Aborted!");
} else {
throw err;
}
}
AbortController ã¯ã¹ã±ã¼ã©ãã«ã§, è¤æ°ã® fetch ãä¸åº¦ã«ãã£ã³ã»ã«ãããã¨ãã§ãã¾ãã
ä¾ãã°ããã§ã¯ãå¹³è¡ãã¦è¤æ°ã® urls ã fetch ããã³ã³ããã¼ã©ã¯ããããã¹ã¦ã䏿¢ãã¾ãã:
let urls = [...]; // å¹³è¡ã㦠fetch ãã url ã®ãªã¹ã
let controller = new AbortController();
let fetchJobs = urls.map(url => fetch(url, {
signal: controller.signal
}));
let results = await Promise.all(fetchJobs);
// ä»ã®å ´æãã:
// controller.abort() ã§ãã¹ã¦ã® fetch ã忢ãã¾ã
ãã fetch ã¨ã¯å¥ã®ç¬èªã®ã¸ã§ããããå ´åããä¸ã¤ã® AbortController ã使ç¨ã㦠fetch ã¨ä¸ç·ã«ãããã忢ãããã¨ãã§ãã¾ãã
let urls = [...];
let controller = new AbortController();
let ourJob = new Promise((resolve, reject) => {
...
controller.signal.addEventListener('abort', reject);
});
let fetchJobs = urls.map(url => fetch(url, {
signal: controller.signal
}));
let results = await Promise.all([...fetchJobs, ourJob]);
// ä»ã®å ´æãã:
// controller.abort() ã§ãã¹ã¦ã® fetch ã¨ç¬èªã®ã¸ã§ãã忢ãã¾ã
ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã