如何使用indexedDB中的promise在@ngrx / core中设置initialState

时间:2017-12-09 05:09:52

标签: angular indexeddb ngrx ngrx-store

我想使用idb包在ngrx中设置初始状态,该包使用promise来获取数据,但每次尝试设置它时都会收到错误。我读到@ngrx是同步的,这意味着它不适用于promises。 我试过的不同方法:

这是我的idb的包装方法,可以在数据中加载它正常工作

<iframe>

我尝试的不同方法设置了初始状态

方法:1

export function getInitialState(): Promise<any> {
  return StorageService.dB.loadInitialState('app-state');
}

方法:2

StoreModule.forRoot(reducers, {initialState: getInitialState})

方法:3

 import { INITIAL_STATE } from '@ngrx/store';
{ provide: INITIAL_STATE, useFactory: getInitialState }

init状态设置为此

export function logger(reducer: ActionReducer<State>): ActionReducer<State> {
  return function (state: State, action: any): State {
   if(action.type === '@ngrx/store/init') {

   }
    return reducer(state, action);
  };

}

我收到此错误

ZoneAwarePromise {__zone_symbol__state: null, __zone_symbol__value: Array(0)}

*******更新*******

我现在得到它,因为dee zg指出每个状态都可以在它们的效果中有一个init函数,当它们被加载时会被触发,我认为这是一个全局的一次性事件。这是我用于Auth状态的一个

ERROR TypeError: Cannot assign to read only property '__zone_symbol__state' of object '[object Object]'
    at resolvePromise (zone.js:810)
    at eval (zone.js:876)
    at ZoneDelegate.invokeTask (zone.js:425)
    at Object.onInvokeTask (core.js:4747)
    at ZoneDelegate.invokeTask (zone.js:424)
    at Zone.runTask (zone.js:192)
    at drainMicroTaskQueue (zone.js:602)
    at ZoneTask.invokeTask [as invoke] (zone.js:503)
    at invokeTask (zone.js:1540)
    at IDBRequest.globalZoneAwareCallback (zone.js:1566)

1 个答案:

答案 0 :(得分:1)

效果中有一个init效果会在效果运行时触发。在那里,您可以分派您的行动,获取数据并填写初始状态。 点击Init Action部分: https://github.com/ngrx/platform/blob/master/MIGRATION.md