我正在尋找一個可觀察的擴展方法來做一個逆節流閥。我的意思是讓第一件商品通過,然後在適當的時候忽略商品後面的商品。逆Observable.Throttle
input - due time 2
|*.*.*..*..|
output
|*......*..|
請注意,這是一個不同於以下問題(它們都是相同的)的問題。下面的問題需要固定的抑制持續時間,而我需要抑制持續時間,每當新物品過早到達時就會增加抑制持續時間。直觀的解決方案,下面列出的輸出如下:
input - due time 2
|*.*.*..*..|
output
|*...*..*..|
- How to take first occurrence and then supress events for 2 seconds (RxJS)
- How to throttle event stream using RX?
- Rx: How can I respond immediately, and throttle subsequent requests
UPDATE
我想出了以下的解決方案,但是我對調度程序和併發性知之甚少o確保鎖定足夠好。當方法中添加Scheduler
參數時,我也不知道如何實現此方法。
public static IObservable<T> InverseThrottle<T>(this IObservable<T> source, TimeSpan dueTime)
{
IDisposable coolDownSupscription = null;
object subscriptionLock = new object();
return source
.Where(i =>
{
lock (subscriptionLock)
{
bool result;
if (coolDownSupscription == null)
{
result = true;
}
else
{
coolDownSupscription.Dispose();
result = false;
}
coolDownSupscription = Observable
.Interval(dueTime)
.Take(1)
.Subscribe(_ =>
{
lock (subscriptionLock)
{
coolDownSupscription = null;
}
});
return result;
}
});
}
雖然油門不會「開火」,也許你想要Observable.Timer? –
@PaulBetts當源流暫停爲100時,Throttle應該「激發」第一個項目。 – Brandon
@PaulBetts。布蘭登是對的。當源流完成去抖動後,油門即將開始工作,這意味着將會產生一個額外的物品,直到它再次完成去除,等等。 –