在我不断追求吸吮的过程中,我试图理解Rx.net的FirstAsync()
语法。大多数文档适用于已弃用的First()
如果我理解正确,它允许我在流中的第一个元素到达时立即启动流。
假设我有一个流myStream
,我想启动一个获取第一个元素的流,并根据该元素启动一个流。就我而言,它将是一个流
我希望它能做到这一点:
--- 1-2->
--- A --->
我该怎么做?
myStream.FirstAsync().Return(() => return "A"); // doesn't compile
答案 0 :(得分:7)
我不知道为什么其他两个答案都说.FirstAsync()
会返回Task
(或者你应该调用.Result
)。它不会返回Task
,而是返回IObservable<TSource>
。可观测量是可以接受的,但它们不是任务。
要获得所需功能,请执行以下操作:myStream.FirstAsync().Select(_ => "A")
。
您也可以myStream.Take(1).Select(_ => "A")
。这与FirstAsync
版本之间的区别在于,如果FirstAsync
完成而没有任何元素,myStream
版本将抛出异常。 Take(1)
完成后无误。
答案 1 :(得分:3)
回答“ FirstAsync是如何工作的?”:
它返回一个新的IObservable<T>
,其中包含:
源流中的第一项(最终产生一项),然后是完整的。
或者,如果源流完成而不生成项目,
您需要使用Catch
或Subscribe
等处理的异常(通过OnError)。
如果您希望在源完成而没有生成第一个项目时获取默认值而不是异常,请使用FirstOrDefaultAsync