首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用来自indexedDB的承诺在@ngrx/ initialState中设置核心

如何使用来自indexedDB的承诺在@ngrx/ initialState中设置核心
EN

Stack Overflow用户
提问于 2017-12-09 13:09:52
回答 1查看 6.4K关注 0票数 4

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

这是我的idb包装器方法,它可以很好地加载数据

代码语言:javascript
运行
复制
export function getInitialState(): Promise<any> {
  return StorageService.dB.loadInitialState('app-state');
}

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

方法:1

代码语言:javascript
运行
复制
StoreModule.forRoot(reducers, {initialState: getInitialState})

方法:2

代码语言:javascript
运行
复制
 import { INITIAL_STATE } from '@ngrx/store';
{ provide: INITIAL_STATE, useFactory: getInitialState }

方法:3

代码语言:javascript
运行
复制
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);
  };

}

init状态被设置为

代码语言:javascript
运行
复制
ZoneAwarePromise {__zone_symbol__state: null, __zone_symbol__value: Array(0)}

我得到了这个错误

代码语言:javascript
运行
复制
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)

*更新*

我现在明白了,因为dee zg指出每个状态都可以在它们的效果中有一个初始化函数,它将在加载时被激发,我一开始以为这是一个全局的一次性事件。下面是我用来进行身份验证的状态

代码语言:javascript
运行
复制
 @Effect()
  init$: Observable<Action> = defer(() => {
    return from(StorageService.readItem('app', Auth.AUTH_KEY)).pipe(
       map((data: any) => {
        return new Auth.AuthInit(data.state);
      })
    );
  });
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-09 13:32:30

在特效中有一个init动作,当特效运行时会触发该动作。在那里您可以分派您的操作,获取数据并填充初始状态。在此处检查Init Action部分:https://github.com/ngrx/platform/blob/master/MIGRATION.md

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47725517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档