簡體   English   中英

我可以簡化使用Observable.Create從json請求返回對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM