Извлечь предыдущие значения в виде массива в Rxjs 6? - PullRequest
0 голосов
/ 19 сентября 2019

Мне нужна наблюдаемая, которая испускает массив предыдущих значений вплоть до числа 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], так как сейчас это просто семантика.

Ответы [ 2 ]

2 голосов
/ 19 сентября 2019

Вы можете использовать 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]
0 голосов
/ 19 сентября 2019

Для достижения ожидаемого результата одним из вариантов является создание массива на основе числа с использованием карты

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

...