Sono nuovo di zecca per Rx e trovo difficile trovare la documentazione sulla composizione delle promesse in modo tale che i dati dalla prima promessa passino al secondo e così via. Ecco tre promesse di base, i calcoli sui dati non sono importanti, solo che qualcosa di asincrono deve essere fatto usando i dati della promessa precedente.Composizione promessa RxJS (dati di passaggio)
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));
};
Il modo tradizionale per ottenere la composizione di cui sto parlando:
pl().then(p2).then(p3).then(console.log);
mio realizzazione preferita è di Ramda composeP e pipeP:
R.pipeP(p1, p2, p3, console.log)()
Sembra probabile Rx potrebbe essere in grado gestire questo tipo di situazione in modo abbastanza fluido. Tuttavia, la più vicina che ho trovato finora è dal RxJS a asincrona (biblioteca) Confronto qui 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 sembra promettente, ma il codice di cui sopra sembra piuttosto orribile. Avevo anche problemi con il mio esempio perché Rx.Observable.fromPromise (p1) non funzionerà in quanto si aspetta una promessa in sé, non una funzione, e Rx.Observable.defer (p1) non sembra passare parametri come il esempio.
Grazie!
domanda simile, ma senza passaggio di dati: Chaining promises with RxJS
le tue promesse devono essere racchiuse in una funzione? – user3743222
Solo in questo caso se hai definito una promessa inline al di fuori di una catena Promise o osservabile con qualcosa come const p1 = new Promise ((resolve, reject) => {}) inizierà immediatamente la valutazione e non potrebbe ricevere i dati dal precedente promessa eseguita. O sbaglio sulla valutazione immediata? –