angular和ngrx:你能在一个循环中调度一个动作吗?

问题描述 投票:0回答:1

我已经定义了一个效果,它调用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的工作方式吗?你能在循环中发送动作吗?

loops ngrx
1个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.