瀏覽代碼

Add a timeout option to AssetManager.preload()

customisations
alemart 9 月之前
父節點
當前提交
46a0787449
共有 2 個檔案被更改,包括 14 行新增5 行删除
  1. 1
    1
      demos/hello-babylon/demo.js
  2. 13
    4
      plugins/extras/asset-manager.js

+ 1
- 1
demos/hello-babylon/demo.js 查看文件

@@ -99,7 +99,7 @@ class EnchantedDemo extends ARDemo
99 99
             '../assets/cat.glb',
100 100
             '../assets/magic-circle.png',
101 101
             '../assets/it-works.png',
102
-        ]);
102
+        ], { timeout: 20 });
103 103
     }
104 104
 
105 105
     /**

+ 13
- 4
plugins/extras/asset-manager.js 查看文件

@@ -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
 

Loading…
取消
儲存