可观察 - 将2个承诺转换为可观察的

时间:2016-01-22 16:43:58

标签: javascript rxjs observable es6-promise

我有一个流行的场景,我需要创建一个返回数据的promise,这些数据被送到第二个promise。 如果第一个承诺失败,我需要取消第二个承诺。 在承诺'土地看起来像这样:

Fn1.doPromise( initialData )
  .then(info => {
        Fn2.doPromise( info )
              .then(result => {
                  //success - return result
              })
              .catch(error => {
                //error
              });
  })
.catch(error => {
  //cancel 2nd promise and show error
});

现在我正在尝试使用像RxJS之类的东西来学习使用Observables的最佳方法。有谁能给我一个很好的解决方案? 提前谢谢!

2 个答案:

答案 0 :(得分:1)

使用RxJS处理错误的一般问题由here处理。要点是:

  • 捕获错误(使用catch运算符,无论是在实例级别还是在类级别)
  • 使用onErrorResumeNext
  • 忽略错误
  • 重试序列(使用retry
  • 确保清理(使用finally
  • 确保资源处置(使用finallyusing
  • 延迟错误(使用mergeDelayError

关于您的具体问题,您可以使用Rx.Observable.fromPromise将承诺转换为可观察的内容; Rx.Observable.prototype.catch在发生错误时捕获错误。

Rx.Observable.fromPromise(Fn1.doPromise( initialData ))
  .flatMap(info => {
        return Rx.Observable.fromPromise(Fn2.doPromise( info ))
              .flatMap(result => {
                  //success - return result
                  // !! You must return an observable or a promise here !!
              })
              .catch(error => {
                //error
                // !! You must return an observable here !!
              });
  })
.catch(error => {
  //cancel 2nd promise and show error
  // !! You must return an observable here !!
});

示例:

答案 1 :(得分:0)

我也能找到一个很好的通用解决方案来实现我的承诺和链接#39;在做了一些研究之后。有了这个,我可以根据需要使用许多承诺。

const flatMapAll = (...fns) =>
   fns.reduce((acc, fn) =>
   acc.flatMap(fn), Rx.Observable.just())



flatMapAll( p1 ,p2 ,p3).subscribe();