Я новичок в Rx, и мне трудно найти документацию по составлению обещаний, чтобы данные с первого обещания были переданы во второй и т. Д. Вот три очень простых обещания, вычисления по данным не важны, просто что-то нужно сделать с использованием данных предыдущего обещания.RxJS Promise Composition (прохождение данных)
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));
};
Традиционный способ достижения композиции я говорю:
pl().then(p2).then(p3).then(console.log);
Моей любимой реализации является Ramda в composeP и pipeP:
R.pipeP(p1, p2, p3, console.log)()
Похоже Rx может быть в состоянии достаточно легко справиться с такой ситуацией. Тем не менее, ближе всего я нашел до сих пор от RxJS до ASync (библиотека) сравнение здесь 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 кажется перспективным, но приведенный выше код выглядит ужасающе. У меня также были проблемы с моим примером, потому что Rx.Observable.fromPromise (p1) не будет работать, поскольку он ожидает само обещание, а не функцию, а Rx.Observable.defer (p1), похоже, не передает такие параметры, как пример.
Спасибо!
Подобный вопрос, но без передачи данных: Chaining promises with RxJS
Ваши обещания должны быть завернуты в функцию? – user3743222
Только в том случае, если вы определили обещание, встроенное вне цепочки Promise, или наблюдаемое с чем-то вроде const p1 = new Promise ((разрешить, отклонить) => {}), оно сразу начнет оценивать и не сможет получать данные из ранее выполненное обещание. Или я ошибаюсь в отношении непосредственной оценки? –