を完了するために連鎖観測待ち - 私はシンプルな観測鎖を有していて、Rx.Observable.intervalで開始:いくつかのトラブル私はRxJS5で何をしたい達成を持つ
const Rx = require('rxjs');
var i = 0;
const obs = Rx.Observable.interval(100)
.flatMap(function() {
return Rx.Observable.timer(Math.ceil(500*Math.random()))
.map(function(val){
console.log(' => These should all log first => ', val);
return i++;
});
})
.take(5)
.merge() // this doesn't seem to do what I want to do
.map(function (val) {
console.log('all done = > ', val);
});
obs.subscribe();
上記ログ本:
=> These should all log first => 0
all done = > 0
=> These should all log first => 0
all done = > 1
=> These should all log first => 0
all done = > 2
=> These should all log first => 0
all done = > 3
=> These should all log first => 0
all done = > 4
=> These should all log first => 0
=> These should all log first => 0
=> These should all log first => 0
=> These should all log first => 0
=> These should all log first => 0
all done = > [0,1,2,3,4]
それは、私たちはすべてのティムを待っていないことは明らかだ:私はこれを記録しているよ
あなたが "すべて完了しました!"何度もログに記録され、「これはすべて最初にログする必要があります」と散在しています。
私が探している出力を得るにはどうすればよいですか?
通常、これにはzip
を使用できますが、zip
のAPIは、同時に1つの場所にすべてのタイマーオブザーバブルが存在しないため、この使用例には当てはまりません。このこと
const async = require('async');
var i = 0;
async.forever(function(cb){
process.nextTick(function(){
console.log('These should all log first');
const err = i++ === 5;
cb(err, i);
});
}, function done(err, results){
// let's pretend results contains all the i values
console.log('all done');
});
我々はマージのためtakeLastを()に置き換えた場合ことに注意してください()、我々は、すべての後に「すべてが終わっ」ログに記録する「正しい」である「これらのすべての最初のログインする必要があります」が、その後、記録され、「すべて完了します」 50倍!私は "すべて完了"を一度だけ記録したいと思っています。 –
'take'はそれらをバッチしません。十分に見えたらストリームを終了させます。そして、単一のストリーム上の 'merge'は何もしません。例えばを見てください。 http://rxmarbles.com/#mergeでは、何が起きているのかを説明しています。 – jonrsharpe
ええ、あなたはマッピングしているので、要素があるときと同じくらい何度もログに記録すると "すべて完了しました"と思いませんか?このコードに基づいて、私は実際にあなたが "取る"何回も地図コンソールログトリガーを見ることを期待しています。私はあなたのマージの使用は、おそらくあなたが思っているものをマージするものではないので、おそらくあなたが期待していることをしていないと思う(そこに座ってすべての "取られた"オブジェクトを待ってから、 )。 –