Przeglądaj źródła

ImageBitmapLoader: Make error handling more robust. (#31088)

* ImageBitmapLoader: Make error handling more robust.

* ImageBitmapLoader: Simplify code.

* ImageBitmapLoader: Improve comment.

* ImageBitmapLoader: Improve docs.
Michael Herzog 10 miesięcy temu
rodzic
commit
3589a128b4
1 zmienionych plików z 21 dodań i 5 usunięć
  1. 21 5
      src/loaders/ImageBitmapLoader.js

+ 21 - 5
src/loaders/ImageBitmapLoader.js

@@ -1,6 +1,8 @@
 import { Cache } from './Cache.js';
 import { Loader } from './Loader.js';
 
+const _errorMap = new WeakMap();
+
 /**
  * A loader for loading images as an [ImageBitmap]{@link https://developer.mozilla.org/en-US/docs/Web/API/ImageBitmap}.
  * An `ImageBitmap` provides an asynchronous and resource efficient pathway to prepare
@@ -11,7 +13,7 @@ import { Loader } from './Loader.js';
  *
  * You need to set the equivalent options via {@link ImageBitmapLoader#setOptions} instead.
  *
- * Also note that unlike {@link FileLoader}, this loader does not avoid multiple concurrent requests to the same URL.
+ * Also note that unlike {@link FileLoader}, this loader avoids multiple concurrent requests to the same URL only if `Cache` is enabled.
  *
  * ```js
  * const loader = new THREE.ImageBitmapLoader();
@@ -111,15 +113,27 @@ class ImageBitmapLoader extends Loader {
 
 				cached.then( imageBitmap => {
 
-					if ( onLoad ) onLoad( imageBitmap );
+					// check if there is an error for the cached promise
+
+					if ( _errorMap.has( cached ) === true ) {
+
+						if ( onError ) onError( _errorMap.get( cached ) );
+
+						scope.manager.itemError( url );
+						scope.manager.itemEnd( url );
 
-					scope.manager.itemEnd( url );
+					} else {
 
-				} ).catch( e => {
+						if ( onLoad ) onLoad( imageBitmap );
 
-					if ( onError ) onError( e );
+						scope.manager.itemEnd( url );
+
+						return imageBitmap;
+
+					}
 
 				} );
+
 				return;
 
 			}
@@ -163,6 +177,8 @@ class ImageBitmapLoader extends Loader {
 
 			if ( onError ) onError( e );
 
+			_errorMap.set( promise, e );
+
 			Cache.remove( url );
 
 			scope.manager.itemError( url );

粤ICP备19079148号