私はRxの新作で、最初の約束事からのデータが2番目に渡されるような約束事に関する文書を見つけるのが難しいと感じています。ここでは3つの基本的な約束事がありますが、データの計算は重要ではありません。前の約束のデータを使用して非同期処理を行わなければならないということだけです。私が話している構図を達成するためにRxJSプロミス組成(データ受け渡し)
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から非同期(ライブラリ)の比較にあるここ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((resolve、reject)=> {})のようなもので観測可能であると定義した場合、直ちに評価を開始し、約束を守った。あるいは、即時評価について間違っていますか? –