看,我在StackBlitz https://stackblitz.com/edit/rxjs-nndpag上创建了问题

我不知道如何正确使用retryWhen运算符。
我希望它重新订阅我的诺言from(getPromise())并对其进行循环,直到发出期望的值为止。我肯定需要使用retryWhen运算符,因为我可以设置延迟逻辑。

此时,如果Promise第一次生成错误的数字,它将陷入retryWhen运算符中(请参阅StackBlitz上的示例)。

似乎与之相关,因为我使用promise而不是可观察的输入,但是我对此怀疑。
因此,Rxjs社区,我依靠您的笔记。谢谢!

最佳答案

问题是源(承诺对象)仅创建一次,而不是每次引发错误时都创建它。所以我必须使用空源作为初始源:

const source = empty()
  .pipe(
    defaultIfEmpty(undefined)
  )


然后我可以使用switchMap运算符切换到新的Promise对象:

const source = empty()
  .pipe(
    defaultIfEmpty(undefined),
    switchMap(v => getPromise())
  )


因此,下一次重新订阅将获得新的承诺。
这是正确的StackBlitz https://stackblitz.com/edit/rxjs-yrxace
现在它可以按我预期的方式工作-一直持续到得到正确的数字为止。

10-06 08:14