我需要转换和聚合可观察数组中的元素。该序列是开放的,并且可能永远不会完成(基于网络)。
我目前正在使用以下代码:
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]
。但是,我只希望对同一输入数组内的这些值进行平方。
即我需要输出 observable 发出两个数组:[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$
.mergeMap(
(a) => Rx.Observable.from(a)
.map((n) => n * n)
.reduce((acc, n) => { acc.push(n); return acc; }, [])
)
.subscribe(n => { console.log(n); });
您发布的解决方案:
const output = numbers$
.flatMap(n => n)
.map(n => n*n)
.buffer(numbers$.delay(1))
.subscribe(n => { console.log(n); });
基于时间,数组未合并的唯一原因是第一个 next
调用与第二个调用之间的间隔超过一毫秒。
关于javascript - 如何让 .scan() 仅聚合未完成序列中最近发出的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38968947/