Redux 在forkJoin过程中,我如何为每个请求以及当它们全部完成时分派操作?

Redux 在forkJoin过程中,我如何为每个请求以及当它们全部完成时分派操作?,redux,rxjs,ngrx,Redux,Rxjs,Ngrx,我在一个角度项目中使用了ngrx。在本例中,我有一个请求数组。我想在每个请求之后,也在所有请求完成之后发送一个操作 到目前为止,我有一些东西看起来像这样: Observable.forkJoin(requests).pipe( map(() => new actions.requestsSuccessful()), catchError(() => of(new actions.requestsFailed())) ); 其中,请求是一个可观察的数组 上面的代码工作正常,当

我在一个角度项目中使用了ngrx。在本例中,我有一个请求数组。我想在每个请求之后,也在所有请求完成之后发送一个操作

到目前为止,我有一些东西看起来像这样:

Observable.forkJoin(requests).pipe(
  map(() => new actions.requestsSuccessful()),
  catchError(() => of(new actions.requestsFailed()))
);
其中,
请求
是一个可观察的数组

上面的代码工作正常,当所有请求都完成时,我的
requestsSuccessful()
操作被正确调度

但是,我正在实现一个progressbar,我希望在发出每个请求后对其进行更新,但我还希望在发出所有请求的位置保持动作的调度

我不知道如何在每次请求后发送一个操作,而在完成所有操作后保留该操作


有什么想法吗?

还没有测试过。也许这样行得通

let progress=0
Observable.forkJoin(requests.map(e=>e.do(()=>progress++)).pipe(
  map(() => new actions.requestsSuccessful()),
  catchError(() => of(new actions.requestsFailed()))
);

forkJoin
仅在所有可观察对象完成时发出,因此它在这里没有用处。相反,您可以使用
concatAll
concat

如果我理解正确,这是一个模型示例,模拟您想要的

const makeRequest = (v) => of(v)
  .pipe(
    delay(1000), // Simulate delay
    map(response => ({ action: 'WHATEVER', response })), // Map response into action
  );

const requests = [makeRequest(1), makeRequest(2), makeRequest(3)];

from(requests)
  .pipe(
    concatAll(), // Execute Observables in order one at the time
    concat(of({ action: 'ALL_DONE' })), // Append this when all source Observables complete
  )
  .subscribe(console.log);
请参阅实时演示(打开控制台):

此演示将打印以下输出:

{action: "WHATEVER", response: 1}
{action: "WHATEVER", response: 2}
{action: "WHATEVER", response: 3}
{action: "ALL_DONE"}

顺便说一句,在未来的RxJS版本中,将有
endWith
操作符,您可以使用它来代替
concat
,从而使其更具可读性

是一组可观察的东西吗?@Fanchung是的,是的!