diff --git a/src/resolve/resolvable.ts b/src/resolve/resolvable.ts index 769a4661..a524d1cc 100644 --- a/src/resolve/resolvable.ts +++ b/src/resolve/resolvable.ts @@ -162,6 +162,18 @@ export class Resolvable implements ResolvableLiteral { return this.promise || this.resolve(resolveContext, trans); } + /** + * Gets the result of the resolvable. + * + * The return value depends on `policy.async`: + * + * * `WAIT`: Returns the resolved value of the promise, or undefined if it has not yet resolved + * * `NOWAIT`: Returns the promise for the result + */ + result() { + return this.policy.async === 'NOWAIT' ? this.promise : this.data; + } + toString() { return `Resolvable(token: ${stringify(this.token)}, requires: [${this.deps.map(stringify)}])`; } diff --git a/test/resolveSpec.ts b/test/resolveSpec.ts index 99e04457..4c4a7bd6 100644 --- a/test/resolveSpec.ts +++ b/test/resolveSpec.ts @@ -398,8 +398,8 @@ describe('Resolvables system:', function () { }); }); - describe('NOWAIT Resolve Policy', () => { - it('should allow a transition to complete before the resolve is settled', async (done) => { + describe('Resolve Policy', () => { + it('NOWAIT should allow a transition to complete before the resolve is settled', async (done) => { let resolve, resolvePromise = new Promise(_resolve => { resolve = _resolve; }); $registry.register({ @@ -461,6 +461,54 @@ describe('Resolvables system:', function () { $state.go('nowait'); }); + + fit('NOWAIT should return a promise from .result()', async (done) => { + let promiseResolveFn, resolvePromise = new Promise(resolve => { promiseResolveFn = resolve; }); + + $registry.register({ + name: 'nowait', + resolve: [ + { token: 'nowait', policy: { async: 'NOWAIT' }, resolveFn: () => resolvePromise }, + { token: 'wait', policy: { async: 'WAIT' }, resolveFn: () => new Promise(resolve => resolve('should wait')) }, + ], + }); + + $transitions.onSuccess({ }, trans => { + let resolvable = tail(trans.treeChanges('to')).resolvables[0]; + let result = resolvable.result(); + expect(result instanceof Promise).toBeTruthy(); + result.then(val => { + expect(val).toBe('foobar'); + done(); + }); + + promiseResolveFn('foobar'); + }); + + $state.go('nowait'); + }); + + fit('WAIT should return the resolved value from .result()', async (done) => { + let promiseResolveFn, resolvePromise = new Promise(resolve => { promiseResolveFn = resolve; }); + + $registry.register({ + name: 'nowait', + resolve: [ + { token: 'nowait', policy: { async: 'NOWAIT' }, resolveFn: () => resolvePromise }, + { token: 'wait', policy: { async: 'WAIT' }, resolveFn: () => new Promise(resolve => resolve('should wait')) }, + ], + }); + + $transitions.onSuccess({ }, trans => { + let resolvable = tail(trans.treeChanges('to')).resolvables[1]; + let result = resolvable.result(); + expect(result).toBe('should wait'); + done(); + }); + + $state.go('nowait'); + }); + }); });