javascript - RxJS Observable.combineLatest 永远不会完成

标签 javascript rxjs

我的一个 Observable.combineLatest 永远不会完成,因为它的一个 observable 永远不会发出值,所以永远不会达到完成功能。

有没有办法让我可以设置一种timeOut,然后我可以为它提供一个默认值?或者至少是一种判断哪个可观察对象根本没有发出任何数据的方法?

有点像

Observable.combineLatest(...).onTimeOut(() => console.log('No data from 3th observable')

编辑:

鉴于此:

Observable.combineLatest(
  observable1, // <- ok
  observable2, // <- ok
  observable3, // <- timeout
  observable4, // <- ok
  observable5, // <- ok
  (...args) => ({...args})
)
.pipe(
  timeout(1*1000),
  catchError((e) => {
    console.log(e)
    return Observable.of({})
  })
)
.subscribe(() => {})

我怎么知道 observable3 是造成超时的原因?

最佳答案

您可以使用 timeoutcatchError此用例的运算符(或只是 timeoutWith ,请参阅下面的编辑):

combineLatest(...).pipe(
  timeout(myTimeoutValueInMilliseconds),
  // Catch the error thrown by the timeout and return a default value instead.
  catchError(() => of('my default value'))
).subscribe(e => console.log(e))

当然,如果你只需要一个 Observables 的超时,那么你可以按如下方式重组它:

combineLatest(
   myObsOne.pipe(
    timeout(myTimeoutValueInMilliseconds),
    catchError(() => of('my default value'))
  ),
  myObsTwo
).subscribe(e => console.log(e))

编辑

正如 Oles Savluk 在评论中指出的那样,您可以使用 timoutWith 来简化此解决方案。而不是 timeoutcatchError:

combineLatest(
   myObsOne.pipe(
    timeoutWith(myTimeoutValueInMilliseconds, of('my default value')),
  ),
  myObsTwo
).subscribe(e => console.log(e))

关于javascript - RxJS Observable.combineLatest 永远不会完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58098493/

相关文章:

javascript - 比较 RxJS 中的集合键?

angular - Subject 和 Observable,如何删除 item,filter() list 和 next()

javascript - 如何将滚动条设置为该部分内的 div 容器?

javascript - 获取路径上 D3 点的 x,y 位置

javascript - switch语句等于===还是==?

Angular 6 更新 - 找不到 rxjs-5-to-6-migrate 命令

javascript - AngularJS - 依赖下拉列表 : storing one value in model, 使用其他作为下一个下拉列表的来源

javascript - 如何根据开发环境或生产环境动态导入或需要 js 文件?

angular - @ngrx/effects API 请求处理

angular - 我应该取消订阅根 Angular 组件中的可观察对象吗?