我有一个定期发出JavaScript对象的行为主题。我想构建另一个可观察对象,它将发出底层可观察对象的先前和当前值,以便比较两个对象并确定增量。
pairwise()或bufferCount(2,1)操作符看起来很合适,但它们只有在缓冲区填满后才开始发出,但我要求这个可观察对象从基础可观察对象的第一个事件开始发出。
subject.someBufferingOperator()
.subscribe([previousValue, currentValue] => {
/** Do something */
})
;
在第一次发射时,previousValue
可能只是null
。
是否有一些内置的运算符,我可以使用以达到预期的结果?
下面是一个简单的运算符:
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示例
以下是rxjs 6的代码片段
subject
.pipe(
startWith(undefined),
pairwise()
)
.subscribe(([previousValue, currentValue]) => {
/** Do something */
});
因为没有值,所以startWith()中的值应该是未定义的。通常,null定义为“我们有一个值,这个值为空”。
实际上,它就像将成对()
与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
我有两个源观测值,当一个源观测值发出时,我需要计算一些数据。我试图使用操作符,但它只在每个源观测值第一次发出时发出一个值。 是否有任何运算符类似于,一旦任何源可观测对象第一次发出,就立即发出?如果没有,最清晰的方法是什么? 我所尝试的: