Rxjs 在Rx中,我可以得到完整的序列,而不是只得到最后一个去抖动的对象吗?

Rxjs 在Rx中,我可以得到完整的序列,而不是只得到最后一个去抖动的对象吗?,rxjs,rx-java,reactive,Rxjs,Rx Java,Reactive,我想知道其中一个脱落的物体是不是一个绿色的球。在去盎司之前或之后仅过滤绿球会导致错误行为。如果我正确理解您想要实现的目标,您可能需要构建一个可观察对象,它会发射某种类型的对象,其中包含源值(即,在您的情况下,蓝色、红色、绿色)以及一个标志,该标志指示取消公告的值中是否有绿色 如果这是真的,那么您可以尝试按照这些行进行编码 const s = new Subject<string>(); setTimeout(() => s.next('B'), 100); setTimeou


我想知道其中一个脱落的物体是不是一个绿色的球。在去盎司之前或之后仅过滤绿球会导致错误行为。

如果我正确理解您想要实现的目标,您可能需要构建一个可观察对象,它会发射某种类型的对象,其中包含源值(即,在您的情况下,蓝色、红色、绿色)以及一个标志,该标志指示取消公告的值中是否有绿色

如果这是真的,那么您可以尝试按照这些行进行编码

const s = new Subject<string>();

setTimeout(() => s.next('B'), 100);
setTimeout(() => s.next('G'), 1100);
setTimeout(() => s.next('B'), 1200);
setTimeout(() => s.next('G'), 1300);
setTimeout(() => s.next('R'), 1400);
setTimeout(() => s.next('B'), 2400);

let hasGreen = false;

s
.do(data => hasGreen =  hasGreen || data === 'G')
.debounceTime(500)
.map(data => ({data, hasGreen})) // this map has to come before the following do
.do(() => hasGreen =  false)
.subscribe(data => console.log(data))
const s=新主题();
setTimeout(()=>s.next('B'),100);
setTimeout(()=>s.next('G'),1100);
setTimeout(()=>s.next('B'),1200);
setTimeout(()=>s.next('G'),1300);
setTimeout(()=>s.next('R'),1400);
setTimeout(()=>s.next('B'),2400);
让hasGreen=false;
s
.do(数据=>hasGreen=hasGreen | |数据==='G')
.debounceTime(500)
.map(data=>({data,hasGreen}))//此映射必须在以下操作之前出现
.do(()=>hasGreen=false)
.subscribe(数据=>console.log(数据))

注意顺序。特别是,您必须将创建要发射的对象的
map
操作符放在重置变量的
do
之前。

这可以通过一组非平凡的操作符来完成,并通过引入额外通道来影响流:

import java.util.Queue;
导入java.util.concurrent.*;
导入java.util.concurrent.AtomicLong;
导入org.junit.Test;
导入io.reactivex.*;
导入io.reactivex.functions.Consumer;
导入io.reactivex.schedulers.*;
导入io.reactivex.subjects.PublishSubject;
公共类去BounceTimeDrop{
@试验
公开无效测试(){
PublishSubject源=PublishSubject.create();
TestScheduler scheduler=新的TestScheduler();
source.compose(去BounceTime(10,TimeUnit.ms,调度程序,v->{
System.out.println(
已删除:“+v+”@T=“+scheduler.now(TimeUnit.ms));
}))
.subscribe(v->System.out.println(
已通过:“+v+”@T=“+scheduler.now(TimeUnit.ms)),
可丢弃::printStackTrace,
()->System.out.println(
“完成”+“@T=“+scheduler.now(TimeUnit.ms));
资料来源.onNext(1);
scheduler.advanceTimeBy(10,时间单位为毫秒);
scheduler.advanceTimeBy(20,时间单位为毫秒);
资料来源:onNext(2);
scheduler.advanceTimeBy(1,时间单位为毫秒);
资料来源:onNext(3);
scheduler.advanceTimeBy(1,时间单位为毫秒);
资料来源:onNext(4);
scheduler.advanceTimeBy(1,时间单位为毫秒);
资料来源:onNext(5);
scheduler.advanceTimeBy(10,时间单位为毫秒);
scheduler.advanceTimeBy(20,时间单位为毫秒);
资料来源:onNext(6);
scheduler.advanceTimeBy(10,时间单位为毫秒);
scheduler.advanceTimeBy(20,时间单位为毫秒);
source.onComplete();
}
公共静态可观测转换器去BounceTime(
长时间,时间单位,调度程序,

Consumer您可以将缓冲运算符与去盎司运算符一起使用。下面是一个非常基本的示例:

// This is our event stream. In this example we only track mouseup events on the document
const move$ = Observable.fromEvent(document, 'mouseup');

// We want to create a debounced version of the initial stream
const debounce$ = move$.debounceTime(1000);

// Now create the buffered stream from the initial move$ stream. 
// The debounce$ stream can be used to emit the values that are in the buffer
const buffered$ = move$.buffer(debounce$);

// Subscribe to your buffered stream
buffered$.subscribe(res => console.log('Buffered Result: ', res));

看起来你需要一个“分组人”接线员。我可以回答这个问题,但是你已经将你的问题标记为
rxjs
Rxjava
。它是哪一个?JavaScript还是java?Rxjava具体来说,我标记了这两个,因为我认为答案是相同的,只是语法不同。你想用那些绿色的做什么?我刚刚看到你的问题是针对Rxjava的。我的例子是专门针对rxjs的,但是它应该与java的工作方式相同。非常感谢!这就成功了!我发现RxJava版本也已经编写好了,这是
RxJava 1.x buffer
下拉列表中的最后一个示例
// This is our event stream. In this example we only track mouseup events on the document
const move$ = Observable.fromEvent(document, 'mouseup');

// We want to create a debounced version of the initial stream
const debounce$ = move$.debounceTime(1000);

// Now create the buffered stream from the initial move$ stream. 
// The debounce$ stream can be used to emit the values that are in the buffer
const buffered$ = move$.buffer(debounce$);

// Subscribe to your buffered stream
buffered$.subscribe(res => console.log('Buffered Result: ', res));