F#反应式编程:等待Observable完成

7

我在 Stack Overflow 上找到了很多相关的问题,但是没有找到 F# 的解决方案。我需要阻塞等待事件触发,并检查它返回的数据。我使用 Rx 接收事件 3 次:

let disposable =
    Observable.take 3 ackNack
    |> Observable.subscribe (
        fun (sender, data) ->
            Console.WriteLine("{0}", data.AckNack)
            Assert.True(data.TotalAckCount > 0u)
    )

我希望将结果转换为列表,以便测试框架(xUnit)稍后可以检查,或者等待所有三个事件完成并通过Assert.True
如何等待3个事件触发后再继续?我可以看到有一个Observable.wait,其他来源建议使用Async.RunSynchronously
1个回答

8
我认为最简单的选项是使用Async.AwaitObservable函数 - 不幸的是,这个函数还没有包含在F#核心库中,但你可以从FSharpx.Async包获取它,或者只需复制GitHub上的函数源代码
使用这个函数,你应该能够编写如下内容:
let _, data = 
  Observable.take 3 ackNack
  |> Async.AwaitObservable
  |> Async.RunSynchronously

Console.WriteLine("{0}", data.AckNack)
Assert.True(data.TotalAckCount > 0u)

谢谢你的回答,Tomas! :) 我会尝试使用Async包。 - alexm
完美地实现了我想要的功能。感谢你在我的两个问题上给予的帮助,Tomas :) - alexm
我就是无法让 Async.AwaitObservable 起作用。 我已经安装了我能找到的每一个nuget,并且看起来都引用了它,但我就是找不到这个函数。 - JonathanPeel
我不确定这个现在在哪里,但你应该能够通过从GitHub复制源代码来获取它... - Tomas Petricek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接