Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 23 additions & 1 deletion src/loaders/FileLoader.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,14 @@ class FileLoader extends Loader {
*/
this.responseType = '';

/**
* Used for aborting requests.
*
* @private
* @type {AbortController}
*/
this._abortController = new AbortController();

}

/**
Expand Down Expand Up @@ -121,7 +129,7 @@ class FileLoader extends Loader {
const req = new Request( url, {
headers: new Headers( this.requestHeader ),
credentials: this.withCredentials ? 'include' : 'same-origin',
// An abort controller could be added within a future PR
signal: ( typeof AbortSignal.any === 'function' ) ? AbortSignal.any( [ this._abortController.signal, this.manager.abortController.signal ] ) : this._abortController.signal
} );

// record states ( avoid data race )
Expand Down Expand Up @@ -338,6 +346,20 @@ class FileLoader extends Loader {

}

/**
* Aborts ongoing fetch requests.
*
* @return {FileLoader} A reference to this instance.
*/
abort() {

this._abortController.abort();
this._abortController = new AbortController();

return this;

}

}


Expand Down
23 changes: 23 additions & 0 deletions src/loaders/ImageBitmapLoader.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,14 @@ class ImageBitmapLoader extends Loader {
*/
this.options = { premultiplyAlpha: 'none' };

/**
* Used for aborting requests.
*
* @private
* @type {AbortController}
*/
this._abortController = new AbortController();

}

/**
Expand Down Expand Up @@ -154,6 +162,7 @@ class ImageBitmapLoader extends Loader {
const fetchOptions = {};
fetchOptions.credentials = ( this.crossOrigin === 'anonymous' ) ? 'same-origin' : 'include';
fetchOptions.headers = this.requestHeader;
fetchOptions.signal = ( typeof AbortSignal.any === 'function' ) ? AbortSignal.any( [ this._abortController.signal, this.manager.abortController.signal ] ) : this._abortController.signal;

const promise = fetch( url, fetchOptions ).then( function ( res ) {

Expand Down Expand Up @@ -191,6 +200,20 @@ class ImageBitmapLoader extends Loader {

}

/**
* Aborts ongoing fetch requests.
*
* @return {ImageBitmapLoader} A reference to this instance.
*/
abort() {

this._abortController.abort();
this._abortController = new AbortController();

return this;

}

}

export { ImageBitmapLoader };
14 changes: 14 additions & 0 deletions src/loaders/Loader.js
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ class Loader {
* This method needs to be implemented by all concrete loaders. It holds the
* logic for loading assets from the backend.
*
* @abstract
* @param {string} url - The path/URL of the file to be loaded.
* @param {Function} onLoad - Executed when the loading process has been finished.
* @param {onProgressCallback} [onProgress] - Executed while the loading is in progress.
Expand Down Expand Up @@ -97,6 +98,7 @@ class Loader {
* This method needs to be implemented by all concrete loaders. It holds the
* logic for parsing the asset into three.js entities.
*
* @abstract
* @param {any} data - The data to parse.
*/
parse( /* data */ ) {}
Expand Down Expand Up @@ -171,6 +173,18 @@ class Loader {

}

/**
* This method can be implemented in loaders for aborting ongoing requests.
*
* @abstract
* @return {Loader} A reference to this instance.
*/
abort() {

return this;

}

}

/**
Expand Down
23 changes: 23 additions & 0 deletions src/loaders/LoadingManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,13 @@ class LoadingManager {
*/
this.onError = onError;

/**
* Used for aborting ongoing requests in loaders using this manager.
*
* @type {AbortController}
*/
this.abortController = new AbortController();

/**
* This should be called by any loader using the manager when the loader
* starts loading an item.
Expand Down Expand Up @@ -269,6 +276,22 @@ class LoadingManager {

};

/**
* Can be used to abort ongoing loading requests in loaders using this manager.
* The abort only works if the loaders implement {@link Loader#abort} and `AbortSignal.any()`
* is supported in the browser.
*
* @return {LoadingManager} A reference to this loading manager.
*/
this.abort = function () {

this.abortController.abort();
this.abortController = new AbortController();

return this;

};

}

}
Expand Down