我尝试每2秒访问一个流,并在此时间内获得第一个值。 示例:
const foo = (): FooReturnType => {
}
type returnType = ReturnType<typeof foo>;
// returnType = FooReturnType
我尝试了类似int this thread的代码(非常类似的问题):
Values: -1--2-3---4-----5--6-7--8
Result: -1-------3--------5------
但是,这2秒不起作用,即使200毫秒后,计数器的更新速度仍然过快。
我想念什么?
使用以下代码将数据添加到主题:
subject.AsObservable().Window(TimeSpan.FromSeconds(2))
.SelectMany(f => f.Take(1))
.Subscribe(f =>
{
Console.WriteLine("Counter: " + counter + " Time:" + DateTime.Now.Millisecond);
counter++;
});
答案 0 :(得分:1)
您的查询似乎很好。让我们通过为其提供一组良好的源数据进行测试:
var rnd = new Random();
var source =
Observable
.Generate(0, x => true, x => x + 1, x => x,
x => TimeSpan.FromSeconds(rnd.NextDouble() / 10.0));
这将每0.0到100.0毫秒产生一个值。因此,如果查询正确,我们应该期望在每个2.0秒窗口的100毫秒内看到一个值(给出或考虑Windows操作系统计时问题)。
以下是该查询的订阅的更好版本:
var sw = Stopwatch.StartNew();
source
.Window(TimeSpan.FromSeconds(2.0))
.SelectMany(f => f.Take(1))
.Subscribe(f =>
{
Console.WriteLine($"Counter: {f} Time: {sw.Elapsed.TotalMilliseconds}");
});
我得到的这些结果是:
Counter: 0 Time: 110.8073 Counter: 33 Time: 2124.7605 Counter: 67 Time: 4061.8636 Counter: 101 Time: 6061.1922 Counter: 134 Time: 8090.158 Counter: 169 Time: 10173.0396 Counter: 197 Time: 12153.0229 Counter: 233 Time: 14138.7718 Counter: 265 Time: 16144.8861 Counter: 296 Time: 18122.042 Counter: 337 Time: 20141.1837 Counter: 373 Time: 22115.0944 Counter: 410 Time: 24162.0706
它有一些计时器漂移,但是遵循预期的模式。该查询有效。