Javascript RxJs:订阅动态变化的流数组 问题
我有可变数量的流数据源-A、B、C。源可以随时添加或删除 所以我创建了这样的源D的数组流来观察这个数组 然后我想处理来自这个源数组的内部数据(例如,它们的值是如何随时间变化的) 因此,我转换它们的状态(toPairs)并将这些数据聚合到订阅中以供D使用(参见代码) 期望Javascript RxJs:订阅动态变化的流数组 问题,javascript,rxjs,observable,rxjs5,Javascript,Rxjs,Observable,Rxjs5,我有可变数量的流数据源-A、B、C。源可以随时添加或删除 所以我创建了这样的源D的数组流来观察这个数组 然后我想处理来自这个源数组的内部数据(例如,它们的值是如何随时间变化的) 因此,我转换它们的状态(toPairs)并将这些数据聚合到订阅中以供D使用(参见代码) 期望 (ok)当我将新数据传递给A、B或C时,那么我应该会看到D订阅中更改状态的数组(从、到) (好)当我将相同的数据传递给A、B或C时,那么我应该看不到任何输出变化 (err)当我将任何数据传递给A、B或C,并且该源显示在列表中时
- (ok)当我将新数据传递给A、B或C时,那么我应该会看到D订阅中更改状态的数组(从、到)
- (好)当我将相同的数据传递给A、B或C时,那么我应该看不到任何输出变化李>
- (err)当我将任何数据传递给A、B或C,并且该源显示在列表中时,那么我应该只看到输出中的一行李>
- (err)当我将相同的源列表传递给D时,那么我应该看到与之前相同的输出
- (err)当我将带有附加项的源列表传递给D时,那么我应该会看到与之前相同的输出以及该附加项的更改
- (err)当我将任何数据传递给A、B或C,并且该源显示在列表中时,那么我应该只看到输出中的一行李>
const Rx = require("rxjs/Rx");
const Promise = require("bluebird");
const A = new Rx.BehaviorSubject("a1");
const B = new Rx.BehaviorSubject("b1");
const C = new Rx.BehaviorSubject("c1");
const DEFAULT_PAIRS = ['??', '??']; // [ <old value>, <new value> ]
const toPairs = ([, oldValue], newValue) => {
return [oldValue, newValue]
};
const A_ = A.asObservable().distinctUntilChanged().scan(toPairs, DEFAULT_PAIRS);
const B_ = B.asObservable().distinctUntilChanged().scan(toPairs, DEFAULT_PAIRS);
const C_ = C.asObservable().distinctUntilChanged().scan(toPairs, DEFAULT_PAIRS);
const D = new Rx.BehaviorSubject([A_, B_]);
D.asObservable()
.startWith([])
.flatMap(streams => {
return Rx.Observable.combineLatest(
...streams,
(...data) => data
)
})
.subscribe(v => {
console.log(v)
});
Promise
.delay(0)
.then(() => console.log('-- change A to new value --'))
.then(() => A.next("a2"))
.delay(0)
.then(() => console.log('-- change A to new value --'))
.then(() => A.next("a3"))
.delay(0)
.then(() => console.log('-- change A to the same value --'))
.then(() => A.next("a3"))
.delay(0)
.then(() => console.log('-- change D to the same array --'))
.then(() => D.next([A_, B_]))
.delay(0)
.then(() => console.log('-- change B to new value --'))
.then(() => B.next("b2"))
.delay(0)
.then(() => console.log('-- change C to new value --'))
.then(() => C.next("c2"))
.delay(0)
.then(() => console.log('-- change D to new array --'))
.then(() => D.next([A_, B_, C_]));
[ [ '??', 'a1' ], [ '??', 'b1' ] ]
-- change A to new value --
[ [ 'a1', 'a2' ], [ '??', 'b1' ] ]
-- change A to new value --
[ [ 'a2', 'a3' ], [ '??', 'b1' ] ]
-- change A to the same value --
-- change D to the same array --
[ [ '??', 'a3' ], [ '??', 'b1' ] ]
-- change B to new value --
[ [ 'a2', 'a3' ], [ 'b1', 'b2' ] ]
[ [ '??', 'a3' ], [ 'b1', 'b2' ] ]
-- change C to new value --
-- change D to new array --
[ [ '??', 'a3' ], [ '??', 'b2' ], [ '??', 'c2' ] ]
[ [ '??', 'a1' ], [ '??', 'b1' ] ]
-- change A to new value --
[ [ 'a1', 'a2' ], [ '??', 'b1' ] ]
-- change A to new value --
[ [ 'a2', 'a3' ], [ '??', 'b1' ] ]
-- change A to the same value --
-- change D to the same array --
[ [ 'a2', 'a3' ], [ '??', 'b1' ] ]
-- change B to new value --
[ [ 'a2', 'a3' ], [ 'b1', 'b2' ] ]
-- change C to new value --
-- change D to new array --
[ [ 'a2', 'a3' ], [ 'b1', 'b2' ], [ 'c1', 'c2' ] ]