2017-12-09 11 views
0

データを取得するためにpromiseを使用するidbパッケージを使用してngrxで初期状態を設定したいが、設定しようとするたびにエラーが発生する。私は@ngrxが同期しているということは、それが約束ではうまくいかないということです。 異なる方法が私が試した:これはデータでロードIDBのための私のラッパー・メソッドは、それが正常に動作しているindexedDBの約束で@ ngrx/coreのinitialStateを設定する方法

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

と私は初期状態

方法を設定しようとした別の方法:1を

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

方法:2

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

方法:3

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)} 

に設定されますと、私は

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) 

*******アップデートを、このエラーが発生します** *****

私はそれが今すべての州の可能性を指摘したようにそれらがロードされるときに起動されるエフェクトにはinit関数がありますが、最初はグローバルなワンタイムイベントだと思いました。ここで私は認証状態

@Effect() 
    init$: Observable<Action> = defer(() => { 
    return from(StorageService.readItem('app', Auth.AUTH_KEY)).pipe(
     map((data: any) => { 
     return new Auth.AuthInit(data.state); 
     }) 
    ); 
    }); 

答えて

1

効果がRANを取得する際に発火する効果がinitアクションがあるために使用するものです。あなたのアクションをディスパッチし、データを取得し、初期状態を埋めることができます。ここ チェックInit Actionセクション: https://github.com/ngrx/platform/blob/master/MIGRATION.md

+0

initはあなたに感謝し、彼らの例では、彼らは元を延期使用存在を知りませんでした:初期化$:観察可能 =延期(()=>(新RootInitの())); RootInitでペイロードとして送信するには、どうすればそれを約束することができますか? – ramon22

関連する問題