在我永恒的追求中,我试图理解Rx.net的FirstAsync()
语法。大多数文档适用于已弃用的First()
如果我理解正确,它允许我在流中的第一个元素到达时立即启动流。
假设我有一个流myStream
,我想启动一个流,该流采用第一个元素并基于该元素启动流。就我而言,它将是一个流。
我希望它这样做:
---1-2->
---A--->
我该怎么做?
myStream.FirstAsync().Return(() => return "A"); // doesn't compile
为什么其他两个答案说.FirstAsync()
返回一个Task
(或者你应该称.Result
(。它不返回Task
,它返回一个IObservable<TSource>
。可观察量是可等待的,但它们不是任务。
要实现所需的功能,请执行以下操作:myStream.FirstAsync().Select(_ => "A")
。
你也可以做myStream.Take(1).Select(_ => "A")
.此版本与FirstAsync
版本的区别在于,如果myStream
完成而没有任何元素,则FirstAsync
版本将引发异常。 Take(1)
将完成,没有错误。
在回答">FirstAsync 如何工作?"时:
它返回一个新的IObservable<T>
,其中包含:
-
源流中的第一个项目(当它最终生成一个时(,后跟一个完整的项目。
-
或者,如果源流完成而不生成项目,异常(通过 OnError(,您需要使用
Catch
或Subscribe
等进行处理。
如果您希望在源完成而不生成第一项时获取默认值而不是异常,请使用 FirstOrDefaultAsync