diff --git a/test/test.ts b/test/test.ts index dfa11b0..921c74b 100644 --- a/test/test.ts +++ b/test/test.ts @@ -36,14 +36,21 @@ tap.test('should select something', async () => { }); }); -tap.test('should dispatch a state action', async () => { +tap.test('should dispatch a state action', async (tools) => { + const done = tools.defer(); const addFavourite = testStatePart.createAction(async (statePart, payload) => { const currentState = statePart.getState(); currentState.currentFavorites.push(payload); return currentState; }); + testStatePart.waitUntilPresent(state => { + return state.currentFavorites[0]; + }).then(() => { + done.resolve(); + }); await testStatePart.dispatchAction(addFavourite, 'my favourite things'); expect(testStatePart.getState().currentFavorites).to.include('my favourite things'); + await done.promise; }); tap.start(); diff --git a/ts/smartstate.classes.statepart.ts b/ts/smartstate.classes.statepart.ts index e1f339f..eb3187d 100644 --- a/ts/smartstate.classes.statepart.ts +++ b/ts/smartstate.classes.statepart.ts @@ -83,12 +83,13 @@ export class StatePart { public async waitUntilPresent(selectorFn?: (state: TStatePayload) => T): Promise { const done = plugins.smartpromise.defer(); const selectedObservable = this.select(selectorFn); - const subscription = selectedObservable.subscribe(value => { + const subscription = selectedObservable.subscribe(async value => { if (value) { - subscription.unsubscribe(); done.resolve(value); } }); - return await done.promise; + const result = await done.promise; + subscription.unsubscribe(); + return result; } }