【问题标题】:rxjs completes an observable immediately after error instead of continuingrxjs 在出错后立即完成一个 observable 而不是继续
【发布时间】:2017-07-30 19:38:01
【问题描述】:

我正在尝试通过 observable 流式传输一组内容,并且它在第一个错误后停止。将其视为一个项目数组是很简单的,因为它的行为方式相同。

  1. 我正在从一组项目创建一个可观察对象
  2. 将每个项目映射到一个 URL
  3. 将 URL 作为请求承诺调用
  4. 执行 catch(),在发生错误时返回 observable.empty()

使用 RxJS 5:

rx.Observable.from(array)
  .map(self.createUrl)
  .flatMap(x => {
            var options = {
            uri: url,
            headers: {
                "Content-Type": "application/json"
            };
            return rx.Observable.fromPromise(request-promise(options));
        })
  .catch(() => {
    return rx.Observable.empty();})
  .subscribe( x => console.log('success:', x),
           e => console.log('error'),
           () => console.log('complete'));

执行此序列时,代码会在遇到第一个错误后停止。我怀疑 #4 中的空 observable 正在终止 observable,但我不确定为什么。

我想要的过程是处理数组中的所有项目而不管错误 - 最终处理所有成功的项目并在每个错误后恢复。

【问题讨论】:

  • 这种行为是有道理的。如果发生错误,原始的 observable 完成并被一个空的 observable 替换。我想你在找onErrorResumeNext()。例如,与flatMap 结合使用
  • 我尝试了这个想法,将 .from(Array) 行包装为:rx.Observable.onErrorResumeNext(rx.Observable.from(array)),但什么也没做。我不确定如何将它从 flatMap 包装到请求中?还是我错过了介于两者之间的东西?
  • 对不起-pebkac。将可观察的 inside 包裹起来就是你所说的。谢谢。看来我还不能回复修复。

标签: node.js rxjs rxjs5


【解决方案1】:

您只需将catch() 放入flatMap

rx.Observable.from(array)
  .map(self.createUrl)
  .flatMap(x => {
    var options = {
      uri: url,
      headers: {
        "Content-Type": "application/json"
      }
    };
    return rx.Observable
      .fromPromise(request-promise(options))
      .catch(() => rx.Observable.empty());
  })
  .subscribe( x => console.log('success:', x),
           e => console.log('error'),
           () => console.log('complete'));

现在,当内部 Observable 发出错误时,它将立即被捕获,并且不会通过 .flatMap() 传播到主流。

【讨论】:

    猜你喜欢
    • 2016-09-27
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 2020-09-27
    • 1970-01-01
    • 2018-03-17
    相关资源
    最近更新 更多