回答
我會將observable包裹在一個observable中,該observable保證每分鐘至少返回一次值。包裝可以通過運行一個定時器來實現這一點,只要包裝的observable返回一個值就會重新啓動定時器。
因此,只要包裝的observable返回數據或在最後一個事件之後經過了一分鐘,包裝器就會返回數據。
應用程序的其餘部分方便地只是觀察包裝。
這裏有一個(非線程安全的,如果你的來源是多線程)實施RepeatAfterTimeout
運營商:
編輯更新的超時如我所料
// Repeats the last value emitted after a timeout
public static IObservable<TSource> RepeatAfterTimeout<TSource>(
this IObservable<TSource> source, TimeSpan timeout, IScheduler scheduler)
{
return Observable.CreateWithDisposable<TSource>(observer =>
{
var timer = new MutableDisposable();
var subscription = new MutableDisposable();
bool hasValue = false;
TSource lastValue = default(TSource);
timer.Disposable = scheduler.Schedule(recurse =>
{
if (hasValue)
{
observer.OnNext(lastValue);
}
recurse();
});
subscription.Disposable = source
.Do(value => { lastValue = value; hasValue = true; })
.Subscribe(observer);
return new CompositeDisposable(timer, subscription);
});
}
public static IObservable<TSource> RepeatAfterTimeout<TSource>(
this IObservable<TSource> source, TimeSpan timeout)
{
return source.RepeatAfterTimeout(timeout, Scheduler.TaskPool);
}
我不認爲這將符合要求(即使您實際上在某處使用了超時)。您通過計時器每個週期輸出一個值,而不管來自源的活動。此外,您正在使用過時的版本或Rx。 – 2011-12-21 17:18:09
我有沒有工作完全相同的要求一次。如果在第一次超時之前沒有值觸發,我選擇使用默認值。下面是C#版本:
public static IObservable<T>
AtLeastEvery<T>(this IObservable<T> source, TimeSpan timeout,
T defaultValue, IScheduler scheduler)
{
if (source == null) throw new ArgumentNullException("source");
if (scheduler == null) throw new ArgumentNullException("scheduler");
return Observable.Create<T>(obs =>
{
ulong id = 0;
var gate = new Object();
var timer = new SerialDisposable();
T lastValue = defaultValue;
Action createTimer =() =>
{
ulong startId = id;
timer.Disposable = scheduler.Schedule(timeout,
self =>
{
bool noChange;
lock (gate)
{
noChange = (id == startId);
if (noChange) obs.OnNext(lastValue);
}
//only restart if no change, otherwise
//the change restarted the timeout
if (noChange) self(timeout);
});
};
//start the first timeout
createTimer();
var subscription = source.Subscribe(
v =>
{
lock (gate)
{
id += 1;
lastValue = v;
}
obs.OnNext(v);
createTimer(); //reset the timeout
},
ex =>
{
lock (gate)
{
id += 1; //'cancel' timeout
}
obs.OnError(ex);
//do not reset the timeout, because the sequence has ended
},
() =>
{
lock (gate)
{
id += 1; //'cancel' timeout
}
obs.OnCompleted();
//do not reset the timeout, because the sequence has ended
});
return new CompositeDisposable(timer, subscription);
});
}
如果你不希望有每次通過調度,只是使挑選一個默認的和代表這種方法的重載。我用Scheduler.ThreadPool
。
此代碼的工作原理是使用SerialDisposable
的行爲在來自源的新值進入時「取消」上一次超時調用。還有一個計數器用於計時器已經過去的情況(在這種情況下,處置從Schedule返回將無濟於事),但該方法尚未實際運行。
我研究了更改超時的可能性,但不需要它們解決我正在處理的問題。我記得這是可能的,但沒有任何代碼方便。
這裏是一個班輪,做你想做的。我測試過了,它似乎是正確的。
var results = source
.Publish(xs =>
xs
.Select(x =>
Observable
.Interval(TimeSpan.FromMinutes(1.0))
.Select(_ => x)
.StartWith(x))
.Switch());
讓我知道這是否有訣竅。
我認爲這應該工作在Rx方式(沒有遞歸,但仍涉及副作用):
public static IObservable<TSource> RepeatLastValueWhenIdle<TSource>(
this IObservable<TSource> source,
TimeSpan idleTime,
TSource defaultValue = default(TSource))
{
TSource lastValue = defaultValue;
return source
// memorize the last value on each new
.Do(ev => lastValue = ev)
// re-publish the last value on timeout
.Timeout(idleTime, Observable.Return(lastValue))
// restart waiting for a new value
.Repeat();
}
- 1. 如何檢查手機是否處於閒置狀態或手機是否處於閒置狀態?
- 2. 如何確定進程是否處於空閒狀態C
- 3. 每2秒鐘觀察一次響應狀態,直到完成或失敗
- 4. Angular2刷新API每x分鐘觀察一次響應變化
- 5. 如何確定NestedScrollView是否滾動到最後並且處於空閒狀態?
- 6. 每分鐘檢查一次數據庫
- 7. 如何檢測每分鐘更換一次的時鐘?
- 8. Android:如何檢測手機何時處於活動狀態並閒置?
- 9. 我應該如何每十分鐘運行一次網頁?
- 10. 如何每秒顯示數據並每分鐘寫一次?
- 11. 如何檢查打印機是否處於30分鐘以上的狀態?
- 12. 如何檢測我的應用程序是否處於脫機狀態?
- 13. 如何在asp.net中10分鐘後自動註銷我的網站,在我的網站處於閒置狀態?
- 14. 如何從Runnable檢測Activity是否處於可用狀態?
- 15. 如何檢測QDialog.exec()是否處於活動狀態
- 16. 如何檢測Dispatcher.DisableProcessing是否處於活動狀態?
- 17. 如何按列分組數據並計算每個組的觀察次數
- 18. 應用程序崩潰,如果它處於空閒狀態
- 19. 檢測是否基於鼠標和鍵盤交互計算機處於空閒狀態
- 20. 檢查系統空閒和使系統進入註銷狀態5分鐘後(如果沒有人使用)
- 21. 檢測空閒狀態並記錄用戶輸出(WinForms)
- 22. Wifi只是進入空閒狀態
- 23. 將函數應用於整個數據集x每次觀察的次數
- 24. 如何在手機處於空閒狀態時收集加速度計數據
- 25. 每5分鐘執行一次PHP cron,但在15分鐘後放入一個函數進入休眠狀態
- 26. 空閒狀態檢測Silverlight 4應用程序
- 27. LightSwitch數據庫連接丟失當應用程序處於空閒狀態
- 28. 檢測進程是否空閒
- 29. 檢查Excel是否處於髒狀態
- 30. Vuex:觀察狀態
使用空閒時間檢查和存儲上次公佈值的字段的計時器。 – Maheep 2011-12-21 05:25:25