【问题标题】:How do I make an asynchronous HTTP request with RxNET?如何使用 RxNET 发出异步 HTTP 请求?
【发布时间】:2017-08-24 09:47:51
【问题描述】:

目前我在 Observable.Create() 中使用 await。 ExecuteRequestAsync 是调用HttpClient.GetAsync Method (String) 的包装类

    public IObservable<IList<ExampleResponseModel>> ListExamplesRx()
    {
        return Observable.Create<IList<ExampleResponseModel>>(
            o =>
            {
                try
                {
                    var url = string.Format(Routes.Examples.List);
                    IList<ExampleResponseModel> exampleResponse = await ExecuteRequestAsync<IList<ExampleResponseModel>>(url, HttpMethod.Get);
                    o.OnNext(exampleResponse);
                    o.OnCompleted();
                }
                catch (Exception e)
                {
                    o.OnError(e);
                }
                return Disposable.Empty;
            }
        );
    }

这是最佳做法吗?有没有更合适的rx方案?

【问题讨论】:

  • 一般来说,只要你在.Create 中有return Disposable.Empty;,那么你就做错了。
  • 删除Disposable.Empty 会更正问题吗?类似上述情况应该返回什么:Observable.Create?

标签: c# system.reactive


【解决方案1】:

Task&lt;T&gt;.ToObservable() 满足您的需求:

public IObservable<IList<ExampleResponseModel>> ListExamplesRx()
{
    var url = string.Format(Routes.Examples.List);
    return ExecuteRequestAsync<IList<ExampleResponseModel>>(url, HttpMethod.Get)
        .ToObservable();
}

如果你想要一个冷的 observable(即延迟执行),你可以将上面的内容包装在 Observable.Defer 中。

如果需要支持取消,请看How to create IObservable from Task such that unsubscribing cancels the task?

【讨论】:

  • 另一个可能更好的选项是return Observable.FromAsync(() =&gt; ExecuteRequestAsync&lt;IList&lt;ExampleResponseModel&gt;&gt;(url, System.Net.Http.HttpMethod.Get));。这应该会自动执行延迟执行。
  • @Enigmativity 该解决方案的问题是每次有订阅者时都会发送 HTTP 请求。如果我希望它只在第一次订阅时发送一次,并为以后的订阅者记住响应,该怎么办?
  • @void.pointer - 你必须使用ReplayMulticast
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
  • 2011-01-08
  • 2016-11-15
  • 1970-01-01
  • 2016-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多