mirror of
https://github.com/scratchfoundation/scratch-vm.git
synced 2024-12-26 07:52:50 -05:00
29 lines
1.2 KiB
JavaScript
29 lines
1.2 KiB
JavaScript
|
/**
|
||
|
* Fetch a remote resource like `fetch` does, but with a time limit.
|
||
|
* @param {Request|string} resource Remote resource to fetch.
|
||
|
* @param {?object} init An options object containing any custom settings that you want to apply to the request.
|
||
|
* @param {number} timeout The amount of time before the request is canceled, in milliseconds
|
||
|
* @returns {Promise<Response>} The response from the server.
|
||
|
*/
|
||
|
const fetchWithTimeout = (resource, init, timeout) => {
|
||
|
let timeoutID = null;
|
||
|
// Not supported in Safari <11
|
||
|
const controller = window.AbortController ? new window.AbortController() : null;
|
||
|
const signal = controller ? controller.signal : null;
|
||
|
// The fetch call races a timer.
|
||
|
return Promise.race([
|
||
|
fetch(resource, Object.assign({signal}, init)).then(response => {
|
||
|
clearTimeout(timeoutID);
|
||
|
return response;
|
||
|
}),
|
||
|
new Promise((resolve, reject) => {
|
||
|
timeoutID = setTimeout(() => {
|
||
|
if (controller) controller.abort();
|
||
|
reject(new Error(`Fetch timed out after ${timeout} ms`));
|
||
|
}, timeout);
|
||
|
})
|
||
|
]);
|
||
|
};
|
||
|
|
||
|
module.exports = fetchWithTimeout;
|