【发布时间】:2019-03-29 15:13:05
【问题描述】:
我正在使用System.Reactive.Linq 扩展方法将可观察对象转换为异步方法中的结果。当我有对象引用时,代码可以正确运行;但是,当我将 null 传递给 OnNext 方法时,生成的等待者会抛出
System.InvalidOperationException
HResult=0x80131509
Message=Sequence contains no elements.
Source=System.Reactive
StackTrace:
at System.Reactive.Subjects.AsyncSubject`1.GetResult() in D:\a\1\s\Rx.NET\Source\src\System.Reactive\Subjects\AsyncSubject.cs:line 441
at <namespace>.DataServiceTests.<GetWithInvalidIdShouldReturnNull>d__5.MoveNext() in <local test code>
我期望等待者得到一个空值。我的测试如下:
[Fact]
public async void GetWithInvalidIdShouldReturnNull()
{
var testId = shortid.ShortId.Generate();
var result = await myTestOjbect.GetById(testId);
Assert.Null(result);
}
而GetById 方法是:
public IObservable<object> GetById(string id)
{
return Observable.Create((IObserver<object> observer) => {
var item = this._repository.Get(id); // This returns null when id is not found in collection
observer.OnNext(item);
observer.OnCompleted();
return Disposable.Empty;
});
}
【问题讨论】:
-
我确实发现在
GetbyId(testId)的末尾添加SingleOrDefaultAsync()可以按预期工作,但为什么呢? -
观察者的 OnNext() 如何处理空值?
-
如果这是一个错误状态,observable 应该发送 OnError,而不是 OnNext。观察者期望在 OnNext 中接收有效对象。
-
如果
_repository.Get(id) returns null,await myTestOjbect.GetById应该返回null。您使用的是哪个版本的 Rx? -
@clay - 在这种特殊用法中,null 比异常更可取。 @mm8 -
System.Reactive 4.1.3
标签: c# .net-core system.reactive