diff --git a/packages/core/src/core.ts b/packages/core/src/core.ts index d781560c..4641e88e 100644 --- a/packages/core/src/core.ts +++ b/packages/core/src/core.ts @@ -403,7 +403,7 @@ export class Core { // TODO: manage / use cases for cancellation // this.logger.debug('Transition cancelled'); - // If no debug mode, force back. + // If transition error and no debug mode, force reload page. /* istanbul ignore else */ if (Logger.getLevel() === 0) { this.force(data.current.url.href); diff --git a/packages/core/src/modules/Transitions.ts b/packages/core/src/modules/Transitions.ts index 33ff2b79..b057bee1 100644 --- a/packages/core/src/modules/Transitions.ts +++ b/packages/core/src/modules/Transitions.ts @@ -182,7 +182,9 @@ export class Transitions { } catch (error) { // this.logger.debug('Transition error [sync]'); // this.logger.error(error); - throw new BarbaError(error, 'Transition error [sync]'); + if (this._isTransitionError(error)) { + throw new BarbaError(error, 'Transition error [sync]'); + } } } else { let leaveResult: any = false; @@ -203,7 +205,12 @@ export class Transitions { } catch (error) { // this.logger.debug('Transition error [before/after/leave]'); // this.logger.error(error); - throw new BarbaError(error, 'Transition error [before/after/leave]'); + if (this._isTransitionError(error)) { + throw new BarbaError( + error, + 'Transition error [before/after/leave]' + ); + } } try { @@ -219,7 +226,12 @@ export class Transitions { } catch (error) { // this.logger.debug('Transition error [before/after/enter]'); // this.logger.error(error); - throw new BarbaError(error, 'Transition error [before/after/enter]'); + if (this._isTransitionError(error)) { + throw new BarbaError( + error, + 'Transition error [before/after/enter]' + ); + } } } @@ -297,6 +309,19 @@ export class Transitions { hooks.do('currentRemoved', data); } + private _isTransitionError(error: any) { + if (error.message) { + // Errors from request + return !/Timeout error|Fetch error/.test(error.message); + } + if (error.status) { + // Errors from request + return false; + } + + return true; + } + /** * Do hooks + async transition methods. */