Javascript RxJS重试整个链

Javascript RxJS重试整个链,javascript,rxjs,observable,retry-logic,Javascript,Rxjs,Observable,Retry Logic,我从实时流中读取图像,并定期选择一批。 然后我将它们发送到服务器进行验证。如果验证失败,将抛出HTTP错误。如果发生这种情况,我想得到一批新的图像 this.input.getImages() .throttleTime(500) .switchMap(image => new Observable<{}>(observer => { // Some operation }) .map(i => ({ i

我从实时流中读取图像,并定期选择一批。 然后我将它们发送到服务器进行验证。如果验证失败,将抛出HTTP错误。如果发生这种情况,我想得到一批新的图像

this.input.getImages()
  .throttleTime(500)
  .switchMap(image =>

      new Observable<{}>(observer => {
        // Some operation
      })
      .map(i => ({ image, i }))

  ).filter(({ i }) =>  {
    // some filtering
  })
  .map(({ image }) => image)
  .take(6)
  .bufferCount(6)
  .map(images =>  // switch map??
    Observable.fromPromise(this.server.validate(images))
  )
  .retry(2)  // This only retrys the request, I want it to retry the whole chain (to get valid images)
  .subscribe(images => {
      console.log('All done')
    },
    err => {console.log(err)}
  )
this.input.getImages()
.节流时间(500)
.switchMap(图像=>
新的可观察对象(观察者=>{
//一些手术
})
.map(i=>({image,i}))
).filter({i})=>{
//一些过滤
})
.map(({image})=>image)
.take(6)
.bufferCount(6)
.map(图像=>//切换映射??
Observable.fromPromise(this.server.validate(图像))
)
.retry(2)//这只是重试请求,我希望它重试整个链(以获取有效图像)
.订阅(图像=>{
console.log(“全部完成”)
},
err=>{console.log(err)}
)
我遇到的问题是,只有HTTP请求会被重试,因为这是新的可观察对象。必须有某种方法将链的开头封装到一个可观察的对象中?

请参阅。该示例显示了在抛出错误时从源代码开始重新启动的所有内容

该页面显示
pipe
语法,但如果您愿意,JSBin将显示流体操作符语法

基本模式是

const retryMe=this.input.getImages()
.flatMap(val=>{
可观测的(val)
//更多运营商
})
.重试(2);

重试时是否可以从
this.input.getImages()
获取新值?查看文档页面,可以看到每次重试时源即间隔(1000)从0重新启动,因此是的,我希望在重试时再次触发此.input.getImages()。最容易尝试和看到!当然,这取决于getImages()的性质-如果它是“热门”可观察对象(例如网络摄像头),那么您将在重试时获得新图像。啊,好的,现在知道了,我需要从内部可观察对象(duh)中取出throttleTime、take和bufferCount。我经历了一些奇怪的行为。谢谢实际上,我的代码的错误之处在于我使用了
switchMap
而不是
flatMap
。在我的例子中,(val)的
Observable.of没有必要。好吧,
switchMap()
flatMap()
之间的基本区别是,当新输入到达时,前者取消了先前的内部可观测值。如果
//某些操作中没有延迟,那么它们应该以相同的方式工作。