Rxjs 重试运算符使用可观察对象但不使用主题

Rxjs 重试运算符使用可观察对象但不使用主题,rxjs,Rxjs,我尝试使用rxjs rety操作符,它的工作与可观察性很好: const obs$: Observable<number> = new Observable((observer) => { observer.next(1); observer.complete(); }); obs$ .pipe( mergeMap(async () => [ await d

我尝试使用rxjs rety操作符,它的工作与可观察性很好:

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()重新订阅后不发出。