【问题标题】:Splitting an array w/ rxjs and resubscribe when is completed使用 rxjs 拆分数组并在完成时重新订阅
【发布时间】:2020-08-07 05:32:47
【问题描述】:

我有一个数组,我在 rxjs 运算符(scan、concatMap、repeat、map)的帮助下将它拆分为一个延迟 5 毫秒的倍数块,我这样做了

这里:

(data: any[]) =>
from(
    Array.from({ length: Math.ceil(data.length / 5) }, (_v, k) => k + 1)
).pipe(
    scan((_acc, curr) => curr * 5, 0),
    map((index: number) => data.slice(index - 5, index)),
    concatMap((item) => of(item).pipe(delay(5000))),
    repeatWhen(_=> interval(5000))
);

如何在 Observable 完成时跳过(避免)额外的 5000 毫秒延迟(延迟、repeatWhen)。

如果我改用重复运算符,则会收到 超出最大调用堆栈大小 错误

【问题讨论】:

  • 你能在输入和输出中显示你想要什么吗?
  • 作为输入我有一个像这样[{name:"xxx", "lastaName":"xxxx", Id:1}, {name:"xxx", "lastaName":"xxxx", Id:2}, {name:"xxx", "lastaName":"xxxx", Id:3}, {name:"xxx", "lastaName":"xxxx", Id:4}, {name:"xxx", "lastaName":"xxxx", Id:5}, {name:"xxx", "lastaName":"xxxx", Id:6}, {name:"xxx", "lastaName":"xxxx", Id:7}, {name:"xxx", "lastaName":"xxxx", Id:8}, {name:"xxx", "lastaName":"xxxx", Id:9}, {name:"xxx", "lastaName":"xxxx", Id:10}] 的数组,作为输出我想每 5 秒将数组拆分为 5 个元素的块并重新订阅

标签: rxjs


【解决方案1】:
import { from, of } from 'rxjs';
import { bufferCount, delay, concatMap } from 'rxjs/operators';

const people = new Array(100).fill({}).map((v, i) => {
  return {firstNname: 'firstName-' + i, lastName: 'lastName-'+i, id:i}
}
  )
const arraySource = from(people);

const subscribe = arraySource
.pipe(
  bufferCount(5),
  concatMap((array) => of(array).pipe(delay(5000)))
)
.subscribe(val => console.log(val));

Stackblitz

【讨论】:

  • 如何处理源 observable 上的重新订阅?
  • 每次执行函数时,都会创建一个新的 observable。我已经更新了 stackblitz 但您不会重新订阅,您将在与该点相同的 observable 上发出值。
猜你喜欢
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-11
  • 1970-01-01
  • 2019-05-10
  • 1970-01-01
相关资源
最近更新 更多