首页 > 解决方案 > rxjs 收集 Subject 发送的值,然后将过去的值作为数组发送

问题描述

rxjs 收集 Subject 发送的值,然后将过去的值作为数组发送

import { Subject } from "rxjs";

const list$ = new Subject<number>();

list$
  .pipe(/* Which pipeline should I use to achieve the following log information */)
  .subscribe(console.log);

list$.next(1); // log: [1]

list$.next(2); // log: [1,2]

标签: rxjs

解决方案


在 RxJS.pipe()中,您可以列出一系列运算符。每个运算符都是一个纯函数,它接收前一个可观察对象(或运算符)发出的值,并为下一个运算符返回一个新值。

由于运营商提供的实用程序,订阅方法可以保持相当简单,或者完全为空。

鉴于您将每个发出的值转换为数组的要求,我建议使用scan()运算符。与 类似Array.reduce(),该scan()运算符为您提供了一个汇总值,您可以将其添加到来自可观察源(在本例中为您的主题)的每个发射中。

const list = new Subject<number>();

list.pipe(
  scan((numArray, number)=>
    [...numArray, number], [] as number[]
  )
).subscribe(numArray=>console.log(numArray));

list.next(1); // [1]
list.next(2); // [1,2]

我没有包含$在变量名中的原因是,这通常只保留给公共可观察对象(不是主题或订阅,它们不应该暴露给其他类/模块/文件)。


推荐阅读