首页 > 解决方案 > angular 和 ngrx :你能在循环中调度一个动作吗?

问题描述

我已经定义了一个效果,它调用一个 api 来删除服务器中具有特定 uuid 的文件:

@Effect()
  deleteFileImport$: Observable<Action> = this.actions$.pipe(
    ofType(actions.runs.DELETE_FILE_IMPORT),
    map((action: any) => action.payload),
    switchMap((fileImport: FileImport) =>
      this.rest.del(fileImportUrl + fileImport.uuid + '/').pipe(
        map((response: FileImport) => new actions.runs.DeleteFileImportSuccess(response)),
        catchError((err: HttpErrorResponse) => {
          console.log('DELETE_FILE_IMPORT error', err);
          return observableOf(new NotificationAction({
              title: 'File Import Delete Failed',
              body: 'Failed to delete file import: ' + fileImport.filename
            })
          );
        })
      )
    )
  );

如果我在循环中调用此效果:

importFilesToDelete.forEach(file => {
      this.store.dispatch(new actions.runs.DeleteFileImport(file));
    });

只有第一个被删除。如果我跟踪调度调用,我可以看到所有文件都使用传递的正确参数进行处理,但只执行第一个操作。我在 ngrx 的工作方式上遗漏了什么吗?你可以循环调度动作吗?

标签: loopsngrx

解决方案


这里的问题是switchMap操作员将取消挂起的请求。concatMap如果顺序很重要,请使用mergeMap运算符;如果执行顺序不重要,请使用运算符。


推荐阅读