我希望在视觉效果消失后发出事件。视觉效果持续5秒。 这段代码有效,但我认为有更好的解决方案:
Observable.combineLatest(observable1, Observable.of('hold').delay(5000)).subscribe(() => {
alert('ok');
});
当observable1被触发但不早于5秒时,应触发此事件。 (如果observable1在6秒后触发,则此事件应在6秒后触发。如果observable1在3秒后触发,则此事件应在5秒后触发)
答案 0 :(得分:2)
您所描述的内容似乎需要withLatestFrom
仅在其源发出时才会发出:
Observable
.of('hold')
.delay(5000)
.withLatestFrom(observable1, (...values) => values[1])
.subscribe(console.log);
当此运算符从'hold'
发出最新值时,只有延迟Observable1
字符串控制。操作符在其源和Observable1
都发出之前不会发出任何内容,所以即使Observable1
发出后也是如此。 6s
您将收到6s
之后的第一个项目。如果相反,Observable1
早先发出,则会等待'hold'
字符串。
如果您对Observable1
的值不感兴趣,可以忽略投影功能并使用:
...
.withLatestFrom(observable1)
...
答案 1 :(得分:2)
我为不是RxJS编码器而道歉 - 我用C#编写代码。以下是如何在C#中执行此操作:
var observable1 = new Subject<long>();
IObservable<string> query =
Observable
.Merge(
observable1.Take(1).Select(x => "hold"),
Observable.Timer(TimeSpan.FromSeconds(6.0)).Select(x => "hold"))
.Skip(1);
Console.WriteLine(DateTime.Now);
query.Subscribe(x => Console.WriteLine(DateTime.Now));
Thread.Sleep(1000); // 1 second
observable1.OnNext(42);
现在,我可以这样测试:
Thread.Sleep(6000); // 6 seconds
observable1.OnNext(42);
产生:
2017/06/30 17:04:57 2017/06/30 17:05:03
将测试代码更改为:
Thread.Sleep(10000); // 10 seconds
observable1.OnNext(42);
你得到:
2017/06/30 17:08:49 2017/06/30 17:08:55
最后将测试代码更改为:
UIButton
你得到:
2017/06/30 17:09:27 2017/06/30 17:09:37
如果您想要的话,请告诉我。
有人可以编辑我的答案,将我的代码更改为RxJS吗?
答案 2 :(得分:1)
{{1}}
答案 3 :(得分:0)
Rx.js debounceTime运算符仅在经过指定时间后才从源observable中发出最新值。
Observable1.debounceTime(5000).subscribe(() => { alert('ok') } );
答案 4 :(得分:0)
observable1.combineLatest(Observable.timer(5000))
subscribe(([result]) => {
alert('ok');
});