2016-09-07 65 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