Ich lerne RxJS und Angular 2. Angenommen, ich habe eine Versprechenskette mit mehreren asynchronen Funktionsaufrufen, die vom Ergebnis des vorherigen abhängen und wie folgt aussehen:
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);
});
Meine Versuche, dasselbe ausschließlich mit RxJS ohne Verwendung von Versprechungen zu tun, führten zu folgenden Ergebnissen:
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);
});
Es liefert die gleiche Leistung wie die Versprechen-Kette. Meine Fragen sind
Mache ich das richtig Gibt es irgendwelche RxJS-bezogenen Verbesserungen, die ich am obigen Code vornehmen kann?
Wie kann ich diese beobachtbare Kette wiederholt ausführen lassen? Das Hinzufügen eines weiteren Abonnements am Ende führt nur zu einer zusätzlichen 6, obwohl ich davon ausgehe, dass 1, 3 und 6 gedruckt werden.
ObservableChain.subscribe ((finalResult) => {console.log (finalResult);});
ObservableChain.subscribe ((finalResult) => {console.log (finalResult);});
1 3 6 6