Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript RxJs:订阅动态变化的流数组 问题_Javascript_Rxjs_Observable_Rxjs5 - Fatal编程技术网

Javascript RxJs:订阅动态变化的流数组 问题

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,并且该源显示在列表中时

我有可变数量的流数据源-A、B、C。源可以随时添加或删除

所以我创建了这样的源D的数组流来观察这个数组

然后我想处理来自这个源数组的内部数据(例如,它们的值是如何随时间变化的)

因此,我转换它们的状态(toPairs)并将这些数据聚合到订阅中以供D使用(参见代码)

期望
  • (ok)当我将新数据传递给A、B或C时,那么我应该会看到D订阅中更改状态的数组(从、到)
  • (好)当我将相同的数据传递给A、B或C时,那么我应该看不到任何输出变化
  • (err)当我将任何数据传递给A、B或C,并且该源显示在列表中时,那么我应该只看到输出中的一行
  • (err)我将相同的源列表传递给D时,那么我应该看到与之前相同的输出
  • (err)我将带有附加项的源列表传递给D时,那么我应该会看到与之前相同的输出以及该附加项的更改
示例代码 评论 正如您所看到的,每次我将任何数据传递给D时,我都会看到以前的值在输出中丢失

“将B更改为新值”部分也有一个奇怪的地方:它显示了2个输出。第一行是正确的。然后再更新一次,打印出内容不正确的意外行

预期产量 问题: 如何修复此代码,使其打印出预期的行? 你能为这个问题提出其他解决办法吗

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' ] ]