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