Цепочки наблюдаемых в RxJS
Я изучаю RxJS и Angular 2. Предположим, у меня есть цепочка обещаний с несколькими вызовами асинхронных функций, которые зависят от результата предыдущего, который выглядит так:
var promiseChain = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(1);
}, 1000);
}).then((result) => {
console.log(result);
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(result + 2);
}, 1000);
});
}).then((result) => {
console.log(result);
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(result + 3);
}, 1000);
});
});
promiseChain.then((finalResult) => {
console.log(finalResult);
});
мои попытки сделать то же самое исключительно с помощью RxJS без использования обещаний привели к следующему:
var observableChain = Observable.create((observer) => {
setTimeout(() => {
observer.next(1);
observer.complete();
}, 1000);
}).flatMap((result) => {
console.log(result);
return Observable.create((observer) => {
setTimeout(() => {
observer.next(result + 2);
observer.complete()
}, 1000);
});
}).flatMap((result) => {
console.log(result);
return Observable.create((observer) => {
setTimeout(() => {
observer.next(result + 3);
observer.complete()
}, 1000);
});
});
observableChain.subscribe((finalResult) => {
console.log(finalResult);
});
Он дает тот же результат, что и цепочка обещаний. Мои вопросы
Я делаю это право? Есть ли какие-либо улучшения, связанные с RxJS, которые я смогите сделать к вышеуказанному коду
-
Как заставить эту наблюдаемую цепочку выполняться повторно? т. е. добавление другой подписки в конце просто производит дополнительный 6, хотя я ожидаю, что он напечатает 1, 3 и 6.
observableChain.подписаться((finalResult) => { приставка.log (finalResult); });
observableChain.подписаться((finalResult) => { приставка.log (finalResult); });
1 Три Шесть 6
1 ответов
о составе обещание и Rxjs, как это часто задаваемый вопрос, можно сослаться на ряд ранее задаваемые вопросы так, из которых :
- как сделать цепную последовательность в rxjs
- RxJS обещают состав (передача данных)
- последовательность RxJS равнозначна обещанию.тогда()?
по сути, flatMap
эквивалентно Promise.then
.
для вашего второй вопрос: вы хотите воспроизвести уже выданные значения или обработать новые значения по мере их поступления? В первом случае проверьте publishReplay
оператора. Во втором случае достаточно стандартной подписки. Однако, возможно, вам нужно знать о холоде. и горячей дихотомии в зависимости от вашего источника (ср. горячие и холодные наблюдаемые: существуют ли "горячие" и "холодные" операторы? для иллюстрированного объяснения концепции)