javascript - 如何让 .scan() 仅聚合未完成序列中最近发出的数组

标签 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 => { 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/

相关文章:

java - 在 rxjava 中使用一系列 Observable 进行一对多映射

javascript - 如何将选定的可观察对象附加到新添加的元素?

javascript - 如何使用jquery获取最后点击的单选值?

java - java中比较两个数组并返回相等的个数

java - 如何在 Java 中将 2D Array 更改为 ArrayList

reactive-programming - RxSwift 中的 PublishSubject 和 PublishRelay 有什么区别?

javascript - 根据页面更改附加到 HTML 标记的 CSS?

javascript - 抑制 Firefox 中的 native 键盘事件(选择标签)?

C++ 通过引用传递静态数组和动态数组

swift - 'Bool' 不可转换为 '() throws -> Bool'