[英]Can I simplify using Observable.Create to return objects from a json request
我一直在這樣發出我的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請求)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.