2017-08-24 116 views
1

目前我正在使用Observable.Create()內的await。 ExecuteRequestAsync是一個包裝類叫HttpClient.GetAsync Method (String)如何使用RxNET製作異步HTTP請求?

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解決方案?

+0

作爲一般規則,只要你有'返回Disposable.Empty;'的'.Create'那麼你正在做的事情是錯誤的。 – Enigmativity

+0

將刪除'Disposable.Empty'糾正這個問題?在上述情況下應該返回什麼:'Observable.Create'? –

回答

5

Task<T>.ToObservable()做你在找什麼:

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

如果你想有一個冷觀察到的(即延遲執行)。你可以用上面的Observable.Defer

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

+3

另一個可能更好的選擇是'return Observable.FromAsync(()=> ExecuteRequestAsync >(url,System.Net.Http.HttpMethod.Get));'。這應該會自動執行延期執行。 – Enigmativity