如何在 takeWhile 条件的效果中发出错误?
How do I issue an error in effects from a takeWhile condition?
我有一个效果,如果没有点击同一个用户,它会做一些事情,以避免不必要的请求,对吗?
这段代码有效,但是当遇到同一个用户已经点击过的情况,再次点击时,不会向Store报错,不会产生后续效果。
如果我的 takeWhile 不符合我的逻辑,我如何 return 出错?
updatePartial$: Observable<Action> = createEffect(() =>
this.action$.pipe(
ofType(fromPeopleActions.UPDATE_MANY_PARTIAL),
withLatestFrom(this.selectorsService.userFriendClicked),
takeWhile(([action, userFriendClicked]) => action.updates.id !== userFriendClicked.id),
switchMap(([action, userFriendClicked]) => {
console.log('oi');
const peoples: Update<IPeople>[] = [];
const https: Observable<Update<IPeople>>[] = [];
peoples.push(action.updates);
peoples.push({
...userFriendClicked,
changes: {
isClicked: false,
},
});
peoples.forEach((people) => https.push(this.backendService.updatePartial(people)));
return forkJoin(https).pipe(
map(() => fromPeopleActions.UPDATE_MANY_PARTIAL_SUCCESS({ updates: peoples })),
catchError((error) => of(fromPeopleActions.UPDATE_MANY_PARTIAL_FAIL({ error: this.requestHandlerService.getError(error) })))
);
})
)
);
从 RxJS 6.4.0 开始,takeWhile
接受一个可选参数 inclusive
,它将发出第一个未通过谓词的项目。
但是在您的情况下,您需要抛出一个错误,而不是最后一个失败的项目,以便它被 catchError
运算符捕获。一种解决方法是在 takeWhile
之前对相同条件使用 concatMap
,如果失败则抛出错误。尝试以下
updatePartial$: Observable<Action> = createEffect(() =>
this.action$.pipe(
ofType(fromPeopleActions.UPDATE_MANY_PARTIAL),
withLatestFrom(this.selectorsService.userFriendClicked),
concatMap(([action, userFriendClicked]) => {
if (action.updates.id !== userFriendClicked.id) {
return of([action, userFriendClicked]);
}
return throwError('Same user clicked');
}),
takeWhile(([action, userFriendClicked]) => action.updates.id !== userFriendClicked.id),
.
.
我有一个效果,如果没有点击同一个用户,它会做一些事情,以避免不必要的请求,对吗?
这段代码有效,但是当遇到同一个用户已经点击过的情况,再次点击时,不会向Store报错,不会产生后续效果。
如果我的 takeWhile 不符合我的逻辑,我如何 return 出错?
updatePartial$: Observable<Action> = createEffect(() =>
this.action$.pipe(
ofType(fromPeopleActions.UPDATE_MANY_PARTIAL),
withLatestFrom(this.selectorsService.userFriendClicked),
takeWhile(([action, userFriendClicked]) => action.updates.id !== userFriendClicked.id),
switchMap(([action, userFriendClicked]) => {
console.log('oi');
const peoples: Update<IPeople>[] = [];
const https: Observable<Update<IPeople>>[] = [];
peoples.push(action.updates);
peoples.push({
...userFriendClicked,
changes: {
isClicked: false,
},
});
peoples.forEach((people) => https.push(this.backendService.updatePartial(people)));
return forkJoin(https).pipe(
map(() => fromPeopleActions.UPDATE_MANY_PARTIAL_SUCCESS({ updates: peoples })),
catchError((error) => of(fromPeopleActions.UPDATE_MANY_PARTIAL_FAIL({ error: this.requestHandlerService.getError(error) })))
);
})
)
);
从 RxJS 6.4.0 开始,takeWhile
接受一个可选参数 inclusive
,它将发出第一个未通过谓词的项目。
但是在您的情况下,您需要抛出一个错误,而不是最后一个失败的项目,以便它被 catchError
运算符捕获。一种解决方法是在 takeWhile
之前对相同条件使用 concatMap
,如果失败则抛出错误。尝试以下
updatePartial$: Observable<Action> = createEffect(() =>
this.action$.pipe(
ofType(fromPeopleActions.UPDATE_MANY_PARTIAL),
withLatestFrom(this.selectorsService.userFriendClicked),
concatMap(([action, userFriendClicked]) => {
if (action.updates.id !== userFriendClicked.id) {
return of([action, userFriendClicked]);
}
return throwError('Same user clicked');
}),
takeWhile(([action, userFriendClicked]) => action.updates.id !== userFriendClicked.id),
.
.