Ich bin neu bei Rx und finde es schwierig, eine Dokumentation über das Verfassen von Versprechen zu finden, so dass Daten vom ersten Versprechen in das zweite und so weiter übertragen werden. Hier sind drei sehr grundlegende Versprechen, die Berechnungen auf den Daten sind nicht wichtig, nur dass etwas Async mit Daten aus dem vorherigen Versprechen getan werden muss.RxJS Promise Composition (Weitergabe von Daten)
const p1 =() => Promise.resolve(1);
const p2 = x => { const val = x + 1; return Promise.resolve(val); };
const p3 = x => {
const isEven = x => x % 2 === 0;
return Promise.resolve(isEven(x));
};
Der traditionelle Weg, um die Zusammensetzung ich spreche zu erreichen:
pl().then(p2).then(p3).then(console.log);
Meine Lieblings Implementierung ist Ramda der composeP und pipeP:
R.pipeP(p1, p2, p3, console.log)()
Es scheint wahrscheinlich, Rx könnte der Lage sein, mit dieser Art von Situation ziemlich flüssig umzugehen. in der Nähe die ich bisher gefunden habe, ist jedoch von dem RxJS ASYNC (Bibliothek) Vergleich hier https://github.com/Reactive-Extensions/RxJS/blob/master/doc/mapping/async/comparing.md:
var Rx = require('rx'),
fs = require('fs'),
path = require('path');
var file = path.join(__dirname, 'file.txt'),
dest = path.join(__dirname, 'file1.txt'),
exists = Rx.Observable.fromCallback(fs.exists),
rename = Rx.Observable.fromNodeCallback(fs.rename),
stat = Rx.Observable.fromNodeCallback(fs.stat);
exists(file)
.concatMap(function (flag) {
return flag ?
rename(file, dest) :
Rx.Observable.throw(new Error('File does not exist.'));
})
.concatMap(function() {
return stat(dest);
})
.forEach(
function (fsStat) {
console.log(JSON.stringify(fsStat));
},
function (err) {
console.log(err);
}
);
concatMap scheint vielversprechend, aber der obige Code sieht ziemlich schrecklich. Ich hatte auch Probleme mit meinem Beispiel, weil Rx.Observable.fromPromise (p1) nicht funktionieren wird, da es eine Verheißung selbst erwartet, keine Funktion, und Rx.Observable.defer (p1) scheint keine Parameter wie die zu übergeben Beispiel.
Danke!
ähnliche Frage, aber ohne Datenübergabe: Chaining promises with RxJS
müssen Ihre Versprechen in eine Funktion verpackt werden? – user3743222
Nur wenn Sie ein Versprechen inline außerhalb einer Promise-Kette definiert haben oder mit etwas wie const p1 = new Promise ((resolve, reject) => {}) beobachtbar sind, würde es sofort mit der Auswertung beginnen und keine Daten von der vorherigen erhalten ausgeführtes Versprechen. Oder irre ich mich mit der sofortigen Auswertung? –