【问题标题】:Observable - converting 2 promises into an observableObservable - 将 2 个 promise 转换为 observable
【发布时间】:2016-01-22 16:43:58
【问题描述】:

我有一个流行的场景,我需要创建一个返回数据的承诺,该数据被馈送到第二个承诺。 如果第一个承诺失败,我需要取消第二个承诺。 在“承诺”领域,它看起来像这样:

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

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

【问题讨论】:

    标签: javascript rxjs observable es6-promise


    【解决方案1】:

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

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

    关于您的具体问题,您可以使用Rx.Observable.fromPromise 将promise 转换为observable; 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 !!
    });
    

    例子:

    【讨论】:

    • 感谢您花时间解释这一点!
    【解决方案2】:

    在进行更多研究后,我还能够为我的承诺“链接”找到一个很好的通用解决方案。有了这个,我可以根据需要使用许多承诺。

    const flatMapAll = (...fns) =>
       fns.reduce((acc, fn) =>
       acc.flatMap(fn), Rx.Observable.just())
    
    
    
    flatMapAll( p1 ,p2 ,p3).subscribe();
    

    【讨论】:

    • 我猜你指的是我的另一个答案:stackoverflow.com/questions/34701304/…。如果您在答案中引用它会很好,这样从谷歌搜索到达这里的其他用户也可以查看它以获得一些上下文和额外的解释。另请注意,使用该解决方案,您放弃了在问题中使用内部错误处理程序的选项,并且您没有解决错误传播的问题。
    猜你喜欢
    • 2016-08-15
    • 2017-01-12
    • 1970-01-01
    • 2021-12-01
    • 2016-12-25
    • 2018-02-19
    • 2018-08-22
    相关资源
    最近更新 更多