为什么重试操作员不再重新订阅流程?

时间:2019-05-06 06:54:59

标签: javascript rxjs

看,我是在StackBlitz https://stackblitz.com/edit/rxjs-nndpag

上创建的问题

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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