2016-09-07 2 views
2

обещаниями я могу приковывают функции, например, следующие:Эмуляция «затем» поведение Promise с 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 и Observable Если да, то как?

+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

Смежные вопросы