当前位置: 首页 > 知识库问答 >
问题:

RxJS可观察,从第一次发射开始发射先前和当前值

阚原
2023-03-14

我有一个定期发出JavaScript对象的行为主题。我想构建另一个可观察对象,它将发出底层可观察对象的先前和当前值,以便比较两个对象并确定增量。

pairwise()或bufferCount(2,1)操作符看起来很合适,但它们只有在缓冲区填满后才开始发出,但我要求这个可观察对象从基础可观察对象的第一个事件开始发出。

subject.someBufferingOperator()
    .subscribe([previousValue, currentValue] => {
        /** Do something */
    })
;

在第一次发射时,previousValue可能只是null

是否有一些内置的运算符,我可以使用以达到预期的结果?

共有3个答案

狄天逸
2023-03-14

下面是一个简单的运算符:

function withPreviousItem<T>(): OperatorFunction<
  T,
  {
    previous?: T;
    current: T;
  }
> {
  return pipe(
      startWith(undefined),
      pairwise(),
      map(([previous, current]) => ({
        previous,
        current: current!
      }))
    );
}

这样做的好处是,结果具有有意义的属性名称和正确的类型:

  • 之前的T|未定义
  • 当前T(不是T|null

Stackblitz示例

郭凡
2023-03-14

以下是rxjs 6的代码片段

subject
    .pipe(
       startWith(undefined),
       pairwise()
    )
    .subscribe(([previousValue, currentValue]) => {
        /** Do something */
    });

因为没有值,所以startWith()中的值应该是未定义的。通常,null定义为“我们有一个值,这个值为空”。

戈嘉慕
2023-03-14

实际上,它就像将成对()start For()运算符配对一样简单:

subject
    .startWith(null) // emitting first empty value to fill-in the buffer
    .pairwise()
    .subscribe([previousValue, currentValue] => {
        if (null === previousValue) {
            console.log('Probably first emission...');
        }
    })
;
 类似资料:
  • 我想计算单个可观测物体的排放量之间的差异。 如果一个可观测的物体发出一个新的值,有没有办法同时得到它当前和以前的发射?我想要这样的东西: 我该怎么做呢?我是否需要将每个发射存储在一个上限变量中,或者是否有一种奇特的RxJS方法来实现这一点?

  • 我试图创建一个observate,它从firebase查询返回一个列表。问题是,当我调用onNext发出项目,然后调用onComplete时,它会停止发出第一个项目之后的项目,而根本不调用onComplete不会发出任何东西。有没有正确的方法来实现我想要实现的目标?我对RxJava还是很陌生,请原谅我的无知。感谢您的帮助:)

  • 我想创建一个可观察的,将按需发射项目,这意味着我想要一个单一的订阅可观察的,并通知可观察的,我需要基于我的请求的新项目。 这就是我使用Publishsubject所做的: } 下面是活动类中的用法: 所以基本上我订阅了Flowable对象,并将Bitmap对象传递给我的Subject类,通过Flowable继续并返回结果,这个解决方案是正确的还是会产生一些内存泄漏? 是否有更好的解决方案将对象发送

  • 我有一个可观察到的: 我使用 输出为 然后我链 这使得: 然后我链 只留下最新的排放量,所以我的最终输出是: 我的问题是在这种情况下省略了第一个发射。我尝试使用BufferCount()的缓冲区(),并使用以下闭包通知程序: 它发射第一、第三、第五、第七......发射,但它们不重叠。 我怎么能有缓冲区计数(2,1),但发射源的第一次发射可观察到?

  • 让我们考虑下面的示例代码: 在函数gude()中,将创建一个新的observable,它将发出哈希值,该哈希值的前n个前导值设置为零。一个观察者订阅了那个可观察的,并立即取消订阅。让我们假设函数createHashWithNLeadingZeroes()需要相当长的时间来生成响应。 我想这里发生了以下事情: (1) 创建了一个新的可观察对象,描述可观察对象行为的函数被内部存储在属性_subscri

  • 我有两个源观测值,当一个源观测值发出时,我需要计算一些数据。我试图使用操作符,但它只在每个源观测值第一次发出时发出一个值。 是否有任何运算符类似于,一旦任何源可观测对象第一次发出,就立即发出?如果没有,最清晰的方法是什么? 我所尝试的: