首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何动态注册ngrx效果?

如何动态注册ngrx效果?
EN

Stack Overflow用户
提问于 2020-04-17 14:11:22
回答 1查看 889关注 0票数 2

我试图动态地创建一个ngrx效果。

我想要完成的事情:

我希望能够在ngrx存储中分派操作,然后能够在操作成功或失败时决定该做什么。

我是怎么做的(现在):

我店里有三个动作。LOAD_DOCUMENTLOAD_DOCUMENT_SUCCESSLOAD_DOCUMENT_FAILURE。现在,我正在尝试从Actions中创建一个LOAD_DOCUMENT_SUCCESSLOAD_DOCUMENT_FAILURE侦听器。当它们中的任何一个被分派时,它将调用processPostAction()方法。一旦可观察到的操作就绪,我就称之为LOAD_DOCUMENT动作。

这里是我的实现:

代码语言:javascript
复制
@Injectable()
export class DispatchHandlerProcessor<STORE_STATE> {

  actions$: Observable<Action>[] = [];

  constructor(
    private _store: Store<STORE_STATE>,
    private _dispatchedActions: Actions
  ) { } 

  process<SUCC extends Action, FAIL extends Action>(handler: DispatchHandler<SUCC, FAIL>): void {
    const postActionProcessor$: Observable<Action>
      = this._dispatchedActions.pipe(
        ofType(handler.successType, handler.failureType), // Either LOAD_DOCUMENT_SUCCESS or LOAD_DOCUMENT_FAILURE
        tap((action: SUCC | FAIL) => {
          handler.processPostAction(action); // method executed after LOAD_DOCUMENT
      })
    );
    this.actions$.push(postActionProcessor$);
    this._store.dispatch(handler.actionToDispatch); // call LOAD_DOCUMENT
  }

}

当前行为:

目前:

  • 调用process()方法。为效果创建一个可观察的
  • ,并将其添加到数组中。调用LOAD_DOCUMENT_SUCCESS
  • The操作并以在“从不”process(...) called
  • So中的process(...)方法中创建的“LOAD_DOCUMENT效果”结束,我猜:该效果没有注册(如声明的here)

)

我的问题:

如何动态地注册我的效果?是否有更好的方法来实现我正在尝试实现的模式?

小注:操作数组将增长并创建内存问题。就目前而言,这只是一个小黑客,使其发挥作用。理想情况下,我希望注册效果,而不是使用这个数组。

我还意识到@Effect关键字没有放在任何地方。我把它放在第12行时有一个错误Decorators are not valid here

我所有的“正常”效果都运行得很好。

EN

回答 1

Stack Overflow用户

发布于 2020-04-17 15:59:08

实际上,我使用对Actions的订阅来解决这个问题。

以下是代码:

代码语言:javascript
复制
@Injectable()
export class DispatchHandlerProcessor<STORE_STATE> {

  constructor(
    private _store: Store<STORE_STATE>,
    private _dispatchedActions: Actions
  ) { } 

  process<SUCC extends Action, FAIL extends Action>(handler: DispatchHandler<SUCC, FAIL>): void {
    const subscription: Subscription = this._dispatchedActions.subscribe(action => {
      if(action.type == handler.successType || action.type == handler.failureType) {
        handler.processPostAction(<SUCC | FAIL>action);
        subscription.unsubscribe();
      }
    });
    this._store.dispatch(handler.actionToDispatch);
  }
}

不过,如果有人知道答案,我仍然对如何动态注册@Effect感兴趣!

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

https://stackoverflow.com/questions/61273680

复制
相关文章

相似问题

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