我一直在这样发出我的Web请求:
public IObservable<Foo> GetFoo(string fooId)
{
var uri = /* set up the GET query parameters here */;
return Observable.Create<Foo>(
obs => new HttpClient().GetAsync(uri)
.ToObservable()
.Subscribe(response =>
{
try
{
response.EnsureSuccessStatusCode();
response.Content.ReadAsStringAsync()
.ToObservable()
.Select(JObject.Parse)
.Select(json => new Foo(json))
.Subscribe(foo =>
{
obs.OnNext(foo);
obs.OnCompleted();
});
}
catch (Exception e)
{
obs.OnError(e);
}
}));
}
但是,我觉得作为Rx的一个相对较新的人,我可能缺少简化我编写内容的某种方法。似乎外部
Observable
只是内部的一个包装,我可以(以某种方式)公开它,而不是-我只是不知道如何。 最佳答案
试试看:
return Observable.Defer(() => HttpClient().GetAsync(uri))
.SelectMany(async x => { x.EnsureSuccessStatusCode(); return x.Content.ReadAsStringAsync(); })
.Select(JObject.Parse)
.Select(json => new Foo(json));
此处的
Observable.Defer
使其与原始方法wrt订阅的语义相匹配(即,您订阅了两次,发出了2个HTTP请求)。关于c# - 我可以简化使用Observable.Create从json请求返回对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20462378/