【问题标题】:Emit previous values as an array in Rxjs 6?在 Rxjs 6 中将以前的值作为数组发出?
【发布时间】:2019-09-19 19:54:20
【问题描述】:

我需要一个 observable,它发出一个由先前值组成的数组,最多 X 个值。

基本上,类似于bufferCount(),只是我希望它立即发出并保持运行历史记录。

of(1,2,3,4,5,6,7,8,9).pipe(
   bufferHistory(3)  // <-- something like this
).subscribe(v => console.log(v));
// starts
// [1]
// [2,1]
// [3,2,1]
// [4,3,2]
// [5,4,3]
// [6,5,4]
// [7,6,5]
// [8,7,6]
// [9,8,7]
// competes

我找不到执行此操作的 Rxjs 6 运算符,最接近的是 bufferCount(),但它在每个数组发出后重置

数组输出的顺序并不重要。它可以是[3,2,1][1,2,3],因为这只是目前的语义。

【问题讨论】:

    标签: javascript angular rxjs rxjs6


    【解决方案1】:

    您可以为此使用scan

    of(1, 2, 3, 4, 5, 6, 7, 8, 9).pipe(
      scan((acc, val) => {
        acc.unshift(val);
        acc.splice(3);
        return acc;
      }, [])
    ).subscribe(v => console.log(v));
    
    // [1]
    // [2,1]
    // [3,2,1]
    // [4,3,2]
    // [5,4,3]
    // [6,5,4]
    // [7,6,5]
    // [8,7,6]
    // [9,8,7]
    

    或者:

    of(1, 2, 3, 4, 5, 6, 7, 8, 9).pipe(
      scan((acc, val) => {
        acc.push(val);
        return acc.slice(-3);
      }, [])
    ).subscribe(v => console.log(v));
    // [1]
    // [1,2]
    // [1,2,3]
    // [2,3,4]
    // [3,4,5]
    // [4,5,6]
    // [5,6,7]
    // [6,7,8]
    // [7,8,9]
    

    【讨论】:

      【解决方案2】:

      为了达到预期的效果,一种选择是使用地图根据数字创建数组

      import { of} from 'rxjs'; 
      import {  map, bufferCount} from 'rxjs/operators';
      
      
      of(1,2,3,4,5,6,7,8,9).pipe(
         map(x => Array.from(Array(x).keys(), n => n + 1).slice(-3))
      ).subscribe(v => console.log(v));
      

      工作代码供参考-https://stackblitz.com/edit/rxjs-gv8ok5?file=index.ts

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-17
        • 1970-01-01
        • 2022-01-27
        • 1970-01-01
        • 1970-01-01
        • 2019-04-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多