如何在RXJS中发出不早于指定超时的事件?

时间:2017-06-29 13:39:55

标签: rxjs system.reactive

我希望在视觉效果消失后发出事件。视觉效果持续5秒。 这段代码有效,但我认为有更好的解决方案:

Observable.combineLatest(observable1, Observable.of('hold').delay(5000)).subscribe(() => {
    alert('ok');
});

当observable1被触发但不早于5秒时,应触发此事件。 (如果observable1在6秒后触发,则此事件应在6秒后触发。如果observable1在3秒后触发,则此事件应在5秒后触发)

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)

observableInstance.delay怎么样?

{{1}}

答案 3 :(得分:0)

Rx.js debounceTime运算符仅在经过指定时间后才从源observable中发出最新值。

Observable1.debounceTime(5000).subscribe(() => { alert('ok') } );

答案 4 :(得分:0)

observable1.combineLatest(Observable.timer(5000))
    subscribe(([result]) => {
        alert('ok');
    });