|
@@ -45,12 +45,14 @@ class AssetManager
|
45
|
45
|
/**
|
46
|
46
|
* Preload one or more assets
|
47
|
47
|
* @param {string|string[]} url URL(s) of the asset(s)
|
|
48
|
+ * @param {object} [options]
|
|
49
|
+ * @param {number} [options.timeout] timeout, in seconds
|
48
|
50
|
* @returns {Promise<void>}
|
49
|
51
|
*/
|
50
|
|
- preload(url)
|
|
52
|
+ preload(url, options = {})
|
51
|
53
|
{
|
52
|
54
|
if(Array.isArray(url))
|
53
|
|
- return Promise.all(url.map(url => this.preload(url)));
|
|
55
|
+ return Promise.all(url.map(url => this.preload(url, options)));
|
54
|
56
|
|
55
|
57
|
if(typeof url != 'string')
|
56
|
58
|
return Promise.reject(new TypeError());
|
|
@@ -59,7 +61,11 @@ class AssetManager
|
59
|
61
|
if(this._assetMap.has(filename))
|
60
|
62
|
return Promise.resolve();
|
61
|
63
|
|
62
|
|
- return new Promise(resolve => {
|
|
64
|
+ return new Promise((resolve, reject) => {
|
|
65
|
+ const seconds = options.timeout !== undefined ? options.timeout : Infinity;
|
|
66
|
+ const timeoutFn = () => reject(new Error(`Can't preload assets: timeout!`));
|
|
67
|
+ const timeoutId = isFinite(seconds) ? setTimeout(timeoutFn, seconds * 1000) : undefined;
|
|
68
|
+
|
63
|
69
|
fetch(url)
|
64
|
70
|
.then(response => {
|
65
|
71
|
if(!response.ok)
|
|
@@ -77,7 +83,10 @@ class AssetManager
|
77
|
83
|
.catch(error => {
|
78
|
84
|
console.warn(`Can't preload asset "${filename}"! ${error.message} (${url})`);
|
79
|
85
|
})
|
80
|
|
- .finally(resolve);
|
|
86
|
+ .finally(() => {
|
|
87
|
+ clearTimeout(timeoutId);
|
|
88
|
+ resolve();
|
|
89
|
+ });
|
81
|
90
|
});
|
82
|
91
|
}
|
83
|
92
|
|