[只要有时间,我都尝试一次创建HTTP
请求,而不是一个接一个地插入多个调用,而我使用forkJoin
。
但是他不是只发出两个请求,而是执行以下操作:
发生了什么事?
BACKEND:
updatePartial(people: Update<IPeople>): Observable<Update<IPeople>> {
return this.httpClient.patch<Update<IPeople>>(`${this.endpoint}/${people.id}`, people);
}
EFFECT:
updateManyPartial$: Observable<Action> = createEffect(() =>
this.action$.pipe(
ofType(fromPeopleActions.UPDATE_MANY_PARTIAL),
mergeMap((action) => {
const https: Observable<Update<IPeople>>[] = [];
action.updates.forEach((people) => https.push(this.backend.updatePartial(people)));
return forkJoin(https).pipe(
delay(1000),
map(() => fromPeopleActions.UPDATE_MANY_PARTIAL_SUCCESS({ updates: action.updates })),
catchError((error) => of(fromPeopleActions.UPDATE_MANY_PARTIAL_FAIL({ error: this.requestHandler.getError(error) })))
);
})
)
);
减速器:
const peopleReducer = createReducer(
INIT_STATE,
on(fromPeopleAction.GET_ALL_SUCCESS, fromPeopleAction.CREATE_ALL_SUCCESS, (state, { peoples }) => adapter.addMany(peoples, { ...state, loading: false })),
on(fromPeopleAction.UPDATE_MANY_PARTIAL_SUCCESS, (state, { updates }) => adapter.updateMany(updates, { ...state, loading: false })),
on(fromPeopleAction.GET_ALL_FAIL, fromPeopleAction.CREATE_ALL_FAIL, fromPeopleAction.UPDATE_MANY_PARTIAL_FAIL, (state, { error }) => ({
...state,
error,
loading: false,
}))
);
ACTIONS:
export const UPDATE_MANY_PARTIAL = createAction('[PATCH] Partially update many people', props<{ updates: Update<IPeople>[] }>());
export const UPDATE_MANY_PARTIAL_SUCCESS = createAction('[PATCH] Partially update many people with success', props<{ updates: Update<IPeople>[] }>());
export const UPDATE_MANY_PARTIAL_FAIL = createAction('[PATCH] Partially update many people failed', props<{ error: IRequestError }>());
COMPONENT:
openTalkContainer(friend: IPeople): void {
this.selectorsService.userFriendClicked.subscribe((people) => {
this.dispatchService.updateManyPartial([
{
id: people.id,
changes: {
isClicked: false,
},
},
{
id: friend.id,
changes: {
isClicked: true,
},
},
]);
});
}
我遇到的问题是通过订阅选择器,但是我通过执行以下操作解决了这个问题:
openTalkContainer(friend: IPeople): void {
this.subscriberUpdate$.add(
this.selectorsService.userFriendClicked.subscribe((people) => {
this.dispatchService.updateManyPartial([
{
id: people.id,
changes: {
isClicked: false,
},
},
{
id: friend.id,
changes: {
isClicked: true,
},
},
]);
})
);
this.subscriberUpdate$.complete();
this.subscriberUpdate$.unsubscribe();
}
现在,我希望有人向我解释为什么它处于无限循环中,为什么我设法以这种方式解决它。