Angular - 同时执行多个功能

时间:2018-05-24 09:46:57

标签: javascript angular multithreading typescript

我有3个函数,每个函数调用另一个发出API请求的函数。所有这一次一个叫一个需要时间,我想要的是同时调用这三个函数来获得时间。我试图使用mergeMap()但它不起作用。什么都没发生,我试图在我的控制台中显示东西,但似乎mergeMap()中包含的代码没有被执行

这是我使用mergeMap()的代码:

from(['corps', 'disciplines', 'departements']).pipe(
  mergeMap(f => {
    switch (f) {
      case 'corps':
        this.getCorps();
        break;
      case 'disciplines':
        this.getDisciplines();
        break;
      case 'departements':
        this.getDepartements();
        break;
    }
    return undefined;
  })
);

顺便说一句,如果您想通过将第一个数组替换为[this.getCorps(), this.getDisciplines(), this.getDepartements()]来删除此开关案例,并且在没有开关的情况下同时执行这3个功能,那就太棒了!

1 个答案:

答案 0 :(得分:2)

针对您的问题的Awsome解决方案将使用名为ngrx的Reactive extension for Angular中的effects

尽管提供商店管理,但它也集中在触发所有状态变化。这是我的应用程序中的示例,在使用ngrx实现它之后,您的代码(考虑一些重构)是什么样子:

@Effect()
someObservable$: Observable<Action> = this.actions$.ofType(IDENTIFIER_FOR_CALLING_ALL_3_FUNCTIONS).pipe(
    .forkJoin(() => [service.getCorps(), service.getDisciplines(), service.getDepartements()])
        .catch(err => {
            return Observable.of(new FAILURE_ACTION_IDENTIFIER());
        })
    );

我无法检查上面的代码是否100%准确地编写,但它保留了这个概念。这里有什么值得注意的:

  • IDENTIFIER_FOR_CALLING_ALL_3_FUNCTIONS可以是任何操作,可以有很多操作,只需在它们之间添加逗号。
  • 任何效果都可以触发你想要的事件 - 这里触发你所有的方法 - 显然他们需要一些重构(例如 - 将你的方法转移到某些Service

我知道它可能没有很好地呈现,所以我放在introduction course to ngrx/store and ngrx/effects以及link to official Github repository