2016-01-22 148 views
0

我有一个流行的场景,我需要创建一个承诺,返回第二个承诺的数据。 如果第一个承诺失败,我需要取消第二个承诺。 在“无极”的土地,将是这个样子:可观察 - 将2个承诺转换为可观察到的

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的最佳途径。谁能给我一个很好的解决方案? 提前致谢!

回答

1

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

  • 捕获错误(用catch操作者,无论是在实例级别或在类级)
  • onErrorResumeNext
  • 重试序列忽略错误(用retry
  • 确保清理(与finally
  • 确保资源处置(与finallyusing
  • 延迟呃RORS(与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 !! 
}); 

例子:

+0

感谢您花时间解释这一点! – 29er

0

我也能找到我的承诺做一些比较后 '链' 一个很好的通用解决方案研究。有了这个,我可以根据需要使用许多承诺。

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



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

我想你是指我的另一个答案:http://stackoverflow.com/questions/34701304/rxjs-promise-composition-passing-data/34701912#34701912。如果你在你的回答中引用了它的话,这将是很好的,所以从谷歌搜索到达这里的其他用户也可以看看它以获得一些上下文和额外的解释。另外请注意,使用该解决方案,您放弃选项以像在问题中一样拥有内部错误处理程序,并且不会解决错误传播的问题。 – user3743222