javascript - 如何在 ngrx/effect (redux-observable) 中分派(dispatch)多个 Action ?

标签 javascript angular typescript ngrx ngrx-store

我正在使用 Angular 6,ngrx/store。我有负责更新东西的效果。取决于我想分派(dispatch)不同 Action 的一些逻辑。如果我使用 switchMap 而不是 map 有什么区别?

这是我尝试过的方法,但它不起作用:

 @Effect()
  dispathMultipleActions$ = this.actions$.pipe(
    ofType(ActionTypes.UpdateSomething),
    map(() => {
      const actions: Action[] = [];
      const array = [1, 2, 3, 4, 5];
      array.forEach(item => {
        if (item > 3) {
          actions.push(new DeleteAction(item));
        } else {
          actions.push(new ChangeAction(item));
        }
      });
      return actions;
    })
  );

最佳答案

效果转换 Action 流,因此您有 Action 流作为输入和输出。在您的示例中,您将一个操作映射到一个操作数组。操作数组流不是有效的输出类型。您需要展平该数组,这意味着您不会将数组本身发射到输出流中,而是将其每个元素发射到输出流中。

代替:

input:  --a-------a------>
output: --[b,c]---[b,c]-->

你应该这样做:

input:  --a-------a------>
output: --b-c-----b-c-->

为了将数组的 Observable 扁平化为每个元素的 Observable,您可以使用操作符之一 mergeMapswitchMapexhaustMap。在大多数情况下,mergeMap 将是正确的选择。如果您想了解有关这些运算符的更多信息,请查看此 answer .

@Effect()
register$: Observable<Action> = this.actions$.pipe(
  ofType(AuthActionTypes.REGISTER_REQUEST),
  mergeMap((action: RegisterRequest) => {
    // check for register request success
    return [
      new RegisterSuccess(),
      new LoginRequest(action.payload)
    ]
  })
);

关于javascript - 如何在 ngrx/effect (redux-observable) 中分派(dispatch)多个 Action ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50629328/

相关文章:

javascript - Typescript - 输入 React 组件时的 IntrinsicAttributes 和子类型问题

javascript - 在JS中有意义:通过foreach在对象集合中搜索值与使用不同的键保留多个集合

javascript - 为什么有两种 JavaScript 字符串?

c# - 如何在 Angular POST 正文中包含 FormData 以将其作为 IFormFile 从 ASP.NET Core 后端检索

ngFor中的Angular Material扩展面板API,如何自动关闭

javascript - 在 Angular 应用程序的标题部分使用 CSS 或 JS 进行点击可展开文本

javascript - TypeScript 的 Mongoose loadClass 问题

javascript - jQuery Accordion - 无法关闭当前 <dt>

javascript - 人们还在为 Web 应用程序使用 Ajax 吗?

javascript - Angular2 - 将 'activatedRoute.params' 变成 promise