2016-01-22 165 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