Имея некоторые проблемы в достижении того, что я хочу с RxJS5 - У меня есть простая Наблюдаемая цепь, начались с Rx.Observable.interval:Подождите, прикованные наблюдаемые для завершения
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]
это ясно, что мы не ждем всех тим er наблюдаемых до конца, так как вы увидите «все сделано!». многократно заносится в журнал, вкрапленное «Все должны регистрироваться в первую очередь».
Как я могу получить вывод, который я ищу?
Для этого мы можем использовать zip
, но API для zip
не подходит для этого прецедента, потому что у нас нет всех наблюдателей таймера в одном месте одновременно!
Если мой вопрос не был достаточно ясен, здесь является аналогом того, что я хочу сделать, мы блокируем все обратные вызовы, пока мы произвольно не закончим, и мы собрали все результаты:
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() для слияния(), мы зарегистрируем «все сделано» после того, как все «Они должен все журнал первый», который является «правильным», но «все сделано» регистрируются 50x! Я хочу, чтобы «все сделано» было зарегистрировано только один раз :) –
'take' не доставляет их до конца, он просто заканчивает поток, когда его достаточно видно. И «слияние» в одном потоке ничего не делает. Посмотрите, например. http://rxmarbles.com/#merge, который дает хорошие иллюстрации о том, что происходит. – jonrsharpe
Хм, разве вы не ожидали, что «все сделано» будет регистрироваться столько раз, сколько есть элементов, поскольку вы их сопоставляете?Основываясь на этом коде, я бы на самом деле ожидал увидеть, что журнал событий в консоли карты столько раз, сколько вы «берете». Я думаю, что ваше использование слияния, вероятно, не делает то, что вы ожидаете, потому что вы не кормите сливаете то, что считаете себя (оно не просто сидит и ждет все ваши «взятые» объекты, а затем объединяет их сразу). –