2017-06-29 52 views
2

我想在視覺效果傳遞之後發出事件。視覺效果持續5秒。 此代碼的工作,但我認爲這是一個更好的解決方案:如何在RXJS中的指定超時之前發送事件?

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

時observable1會觸發此事件應該被解僱,但不早於5秒。 (如果在6秒後觀察到,則該事件應在6秒後觸發,如果在3秒後觸發該事件,則該事件應在5秒後觸發)

回答

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

observableInstance.delay

observable1.delay(5000).subscribe(() => { 
    alert('ok'); 
}); 
+0

我更新的問題。當observable1被觸發但不早於5秒時,該事件應該被觸發。在你的情況下,如果observable1在6秒後觸發,那麼此事件將在11秒後觸發。在這種情況下我需要6秒。 – Ildar

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) 
... 
2

我的道歉不是一個RxJS編碼器 - 在C#代碼我。下面介紹如何在C#中做到這一點:

IObservable<string> query = 
    Observable 
     .Merge(
      observable1.Take(1).Select(x => "hold"), 
      Observable.Timer(TimeSpan.FromSeconds(6.0)).Select(x => "hold")) 
     .Skip(1); 

現在,我可以測試這個是這樣的:

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); 

產生:

 
2017/06/30 17:04:57 
2017/06/30 17:05:03 

更改測試代碼:

Thread.Sleep(6000); // 6 seconds 
observable1.OnNext(42); 

,你會得到:

 
2017/06/30 17:08:49 
2017/06/30 17:08:55 

最後修改測試代碼:

Thread.Sleep(10000); // 10 seconds 
observable1.OnNext(42); 

,你會得到:

 
2017/06/30 17:09:27 
2017/06/30 17:09:37 

讓我知道這是你想要的。

可能有人請編輯我的回答更改我的代碼以RxJS?

0

Rx.js debounceTime運算符僅在指定時間過後才從源observable發出最新值。

Observable1.debounceTime(5000).subscribe(() => { alert('ok') }); 
相關問題