2016-09-07 29 views
2

有了承諾,我可以鏈中的功能類似於如下承諾行爲:效仿「然後」與RxJS

var p = promiseFactory('1'); 

p.then(function(data){ 
    /*Do something*/ 
    return promiseFactory('2'); 
}).then(function(data){ 
    /*Do something else*/ 
    return value; 
}).catch(function(err){ 
    /*Here I can catch all exceptions threw in then methods*/ 
}); 

我可以渲染RxJS和可觀察到這種行爲如果是的話,怎麼樣?

+1

您可以使用'.flatMap'。其實這取決於你想解決的問題。 –

回答

1

您可以使用.flatMap,但在大多數情況下,這取決於問題要解決這事。,例如考慮HTTP調用鏈,與flatMap你可以解決它像這樣

const $http = (url) => { 
 
    return Rx.Observable.fromPromise(axios.get(url)); 
 
} 
 

 
const url = 'https://jsonplaceholder.typicode.com'; 
 

 
const stream = $http(`${ url }/posts/1`) 
 
    .flatMap(post => $http(`${ url }/comments?postId=${ post.data.id }`)) 
 
    .map((comments) => comments.data) 
 
    .concatAll((comment) => comment) 
 
    .map((comment) => comment.name) 
 
    
 
stream.subscribe((res) => { 
 
    console.log(res); 
 
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.14.0/axios.min.js"></script> 
 
<script src="https://npmcdn.com/@reactivex/[email protected]/dist/global/Rx.umd.js"></script>

+1

注意,當然,這比'Promise.then'更強大。 'Promise.then'接受一個單值,並通過一個函數映射它以返回一個新的'Promise',它產生一個單一的值。 'Observable.flatMap'接受一個0或更多(可能無限制)值的流,並將每個值擴展爲0或更多(可能無限制)值。這是非常有用的,但是由此產生了必要的額外複雜程度(例如Promise中的數據可以輕鬆地在單個函數中處理,但必須先摺疊,掃描或以其他方式縮減爲Rx中的可用形式)。 – Jules