У меня есть два наблюдаемых, которые созданы из того же источника. Они дифференцируются по карте, которая присваивает рандомизированное значение свойству испускаемого элемента. Вот пример логики:Почему эти наблюдаемые RxJS производят странные выходы?
var Rx = require('rx');
var _ = require('lodash');
// create a source that emits a single event, and map that to an empty object
var source = Rx.Observable
.range(0, 1)
.map(function makeObject() { return {}; });
// map the empty object and give each one a type property with the
// value randomly chosen between "a" or "b"
var typed = source.map(function type(obj) {
obj.type = _.sample(['a', 'b']); // obj.type will randomly be 'a' or 'b'
return obj;
});
// create an observable that only contains "a"
var a = typed.filter(function(obj) {
return obj.type === 'a';
});
// create an observable that only contains "b"
var b = typed.filter(function(obj) {
return obj.type === 'b';
});
// merge both observables and log the result in the subscription
Rx.Observable.merge(a, b).subscribe(function(obj) {
console.log(obj);
});
Я бы ожидать, что этот последний объединенный поток всегда будет производить один объект с любой obj.type === 'a'
или obj.type === 'b'
, а затем полной.
Однако каждый раз, когда я запускаю этот скрипт, я получаю различные результаты, некоторые ожидаемые, некоторые неожиданные.
Ожидаемый результат "а":
{ type : 'a' }
Ожидаемый результат "б":
{ type : 'b' }
Неожиданное как:
{ type : 'a' }
{ type : 'b' }
И, иногда я не получаю никакого вывода вообще. Что мне здесь не хватает?
Это больше упражнений в процессе обучения RX? Или вы планируете развертывать этот код? Потому что, по крайней мере, вы заявили, что это серьезный излишний оператор. – paulpdaniels
Это упрощенная версия фактического кода, чтобы проиллюстрировать проблему. Настоящий код является частью более сложной системы. – Stephen