Javascript 如何使.scan()仅聚合未完成序列中最近发出的数组
我需要在一个可观察的数组中转换和聚合元素。序列是开放的,可能永远不会完成(基于网络) 我目前正在使用以下代码:Javascript 如何使.scan()仅聚合未完成序列中最近发出的数组,javascript,arrays,reactive-programming,rxjs,rxjs5,Javascript,Arrays,Reactive Programming,Rxjs,Rxjs5,我需要在一个可观察的数组中转换和聚合元素。序列是开放的,可能永远不会完成(基于网络) 我目前正在使用以下代码: const numbers = [1,2,3]; const numbers$ = new Rx.Subject(); const output = numbers$ .flatMap(n => n) .map(n => n*n) .scan((acc, x) => acc.concat([x]), []) .subscribe(n => {
const numbers = [1,2,3];
const numbers$ = new Rx.Subject();
const output = numbers$
.flatMap(n => n)
.map(n => n*n)
.scan((acc, x) => acc.concat([x]), [])
.subscribe(n => { console.log(n); });
numbers$.next(numbers);
setTimeout(() => {
numbers$.next([5,6,7])
}, 1000);
目前,发射了多个阵列,最近发射的值当前为[1、4、9、25、36、49]
。但是,我只希望这些值在同一输入数组中被平方
也就是说,我需要输出可观测到的正好发射两个数组:[1,4,9]
和[25,36,49]
如何做到这一点?这应该是您正在寻找的:
const output = numbers$
.map((a) => a.map(n => n * n))
.subscribe(n => { console.log(n); });
编辑:如果不想使用Array.map
,可以改用RxJS
您可以将Array.map
替换为一个可观察值,该可观察值将值平方,并将其还原为一个数组。这可以扩展到包括distinct
或其他RxJS操作符(根据您的评论):
您发布的解决方案:
const output = numbers$
.flatMap(n => n)
.map(n => n*n)
.buffer(numbers$.delay(1))
.subscribe(n => { console.log(n); });
是基于时间的,阵列未合并的唯一原因是第一次
下一次调用与第二次调用之间的间隔超过了一毫秒。这应该是您要查找的:
const output = numbers$
.map((a) => a.map(n => n * n))
.subscribe(n => { console.log(n); });
编辑:如果不想使用Array.map
,可以改用RxJS
您可以将Array.map
替换为一个可观察值,该可观察值将值平方,并将其还原为一个数组。这可以扩展到包括distinct
或其他RxJS操作符(根据您的评论):
您发布的解决方案:
const output = numbers$
.flatMap(n => n)
.map(n => n*n)
.buffer(numbers$.delay(1))
.subscribe(n => { console.log(n); });
是基于时间的,阵列未合并的唯一原因是第一次下一次调用与第二次调用之间的间隔超过了一毫秒。看起来这就是您需要的:
看起来这正是您需要的:
我不喜欢使用Array.prototype.map()函数,而是坚持使用RxJS。也就是说,更复杂的转换,如.distinct()
,也可以完成。使用带有嵌套的.from()的mergeMap/flatMap是正确的解决方案。我还利用.toArray()
而不是最后的.reduce()/.scan()将值打包回数组中。我不喜欢使用array.prototype.map()函数,而是坚持使用RxJS。也就是说,更复杂的转换,如.distinct()
,也可以完成。使用带有嵌套的.from()的mergeMap/flatMap是正确的解决方案。我还利用.toArray()
而不是最后的.reduce()/.scan()将值打包回数组。