rxjs在错误后立即完成一个observable而不是继续

时间:2017-03-09 17:28:32

标签: node.js rxjs rxjs5

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

  1. 我正在从一个项目数组
  2. 创建一个observable
  3. 将每个项目映射到网址
  4. 将URL称为请求承诺
  5. 执行一个catch(),在发生错误时返回observable.empty()
  6. 使用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中的空观察是终止了观察,但我不确定为什么。

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

1 个答案:

答案 0 :(得分:3)

您只需将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()传播到主流。