Skip to content

Commit 8769449

Browse files
feat(Resolvable): Add .value(): returns value (WAIT) or promise (NOWAIT)
1 parent 5b11ce0 commit 8769449

File tree

2 files changed

+62
-2
lines changed

2 files changed

+62
-2
lines changed

src/resolve/resolvable.ts

+12
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,18 @@ export class Resolvable implements ResolvableLiteral {
162162
return this.promise || this.resolve(resolveContext, trans);
163163
}
164164

165+
/**
166+
* Gets the result of the resolvable.
167+
*
168+
* The return value depends on `policy.async`:
169+
*
170+
* * `WAIT`: Returns the resolved value of the promise, or undefined if it has not yet resolved
171+
* * `NOWAIT`: Returns the promise for the result
172+
*/
173+
result() {
174+
return this.policy.async === 'NOWAIT' ? this.promise : this.data;
175+
}
176+
165177
toString() {
166178
return `Resolvable(token: ${stringify(this.token)}, requires: [${this.deps.map(stringify)}])`;
167179
}

test/resolveSpec.ts

+50-2
Original file line numberDiff line numberDiff line change
@@ -398,8 +398,8 @@ describe('Resolvables system:', function () {
398398
});
399399
});
400400

401-
describe('NOWAIT Resolve Policy', () => {
402-
it('should allow a transition to complete before the resolve is settled', async (done) => {
401+
describe('Resolve Policy', () => {
402+
it('NOWAIT should allow a transition to complete before the resolve is settled', async (done) => {
403403
let resolve, resolvePromise = new Promise(_resolve => { resolve = _resolve; });
404404

405405
$registry.register({
@@ -461,6 +461,54 @@ describe('Resolvables system:', function () {
461461

462462
$state.go('nowait');
463463
});
464+
465+
fit('NOWAIT should return a promise from .result()', async (done) => {
466+
let promiseResolveFn, resolvePromise = new Promise(resolve => { promiseResolveFn = resolve; });
467+
468+
$registry.register({
469+
name: 'nowait',
470+
resolve: [
471+
{ token: 'nowait', policy: { async: 'NOWAIT' }, resolveFn: () => resolvePromise },
472+
{ token: 'wait', policy: { async: 'WAIT' }, resolveFn: () => new Promise(resolve => resolve('should wait')) },
473+
],
474+
});
475+
476+
$transitions.onSuccess({ }, trans => {
477+
let resolvable = tail(trans.treeChanges('to')).resolvables[0];
478+
let result = resolvable.result();
479+
expect(result instanceof Promise).toBeTruthy();
480+
result.then(val => {
481+
expect(val).toBe('foobar');
482+
done();
483+
});
484+
485+
promiseResolveFn('foobar');
486+
});
487+
488+
$state.go('nowait');
489+
});
490+
491+
fit('WAIT should return the resolved value from .result()', async (done) => {
492+
let promiseResolveFn, resolvePromise = new Promise(resolve => { promiseResolveFn = resolve; });
493+
494+
$registry.register({
495+
name: 'nowait',
496+
resolve: [
497+
{ token: 'nowait', policy: { async: 'NOWAIT' }, resolveFn: () => resolvePromise },
498+
{ token: 'wait', policy: { async: 'WAIT' }, resolveFn: () => new Promise(resolve => resolve('should wait')) },
499+
],
500+
});
501+
502+
$transitions.onSuccess({ }, trans => {
503+
let resolvable = tail(trans.treeChanges('to')).resolvables[1];
504+
let result = resolvable.result();
505+
expect(result).toBe('should wait');
506+
done();
507+
});
508+
509+
$state.go('nowait');
510+
});
511+
464512
});
465513
});
466514

0 commit comments

Comments
 (0)