我一直在这样发出我的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/

10-13 06:37