Rxjs 重试运算符使用可观察对象但不使用主题
我尝试使用rxjs rety操作符,它的工作与可观察性很好:Rxjs 重试运算符使用可观察对象但不使用主题,rxjs,Rxjs,我尝试使用rxjs rety操作符,它的工作与可观察性很好: const obs$: Observable<number> = new Observable((observer) => { observer.next(1); observer.complete(); }); obs$ .pipe( mergeMap(async () => [ await d
const obs$: Observable<number> = new Observable((observer) => {
observer.next(1);
observer.complete();
});
obs$
.pipe(
mergeMap(async () => [
await dataService.getAllSomthing(),
await dataService.getAllomthingElse(),
await dataService.getAllSomthingElseElse(),
]),
map(([somthing, somthingElse, somthingElseElse]) => {
dispatch(
enableToasterAction({
text: "good",
type: ToasterType.Success,
})
);
}),
retry(2),
catchError((err) => {
return of(null);
})
)
.subscribe((val: any) => {});
有人可以帮助我了解它们之间的区别,为什么它适用于可观察对象,而不适用于主体?您可以重试冷可观察对象,但不适用于热可观察对象(主体) 但是,如果您希望通过热可观察对象重试操作触发器,则可以将retry()操作符移动到内部可观察对象。比如说
fromEvent(document,'click').pipe(
switchMap(evt=>from(fetch('someurl')).pipe(retry(2))
)
这样,单击触发的http调用将在失败时重试2次您可以重试冷可观察但不可热可观察(主题) 但是,如果您希望通过热可观察对象重试操作触发器,则可以将retry()操作符移动到内部可观察对象。比如说
fromEvent(document,'click').pipe(
switchMap(evt=>from(fetch('someurl')).pipe(retry(2))
)
这样,单击触发的http调用将在失败时重试2次。Subject有一个内部状态,一旦收到
complete
或error
通知,它将自己标记为并将继续
因此,
retry()
尝试重新订阅,但源主题将只返回订阅。空的,不会进行真正的订阅。主题有一个内部状态,一旦收到完成或错误通知,它将自己标记为并将继续
因此,retry()
尝试重新订阅,但源主题
只会返回订阅。为空
,不会进行真正的订阅。谢谢。但是内部状态未接收到complete或Error,如果您只有主题
它不会在订阅时发出任何信息。因此,当您重新订阅时,无需触发switchMap
。可以使用BehaviorSubject
。sub.next({})执行订阅后发出一次的发射。它在retry()
重新订阅后不会发出。谢谢。但是内部状态未接收到complete或Error。如果您只有Subject
,它在订阅时不会发出任何消息。因此,当您重新订阅时,无需触发switchMap
。可以使用BehaviorSubject
。sub.next({})执行订阅后发出一次的发射。它在retry()重新订阅后不发出。