2011-03-31 35 views
3

使用返回IObservable来实现标准存在/结束异步模式的替代方法是否合理?在下面的代码中,我使用Rx封装了一个传统API,为它提供了一个更好的接口。使用IObservable实现异步方法

Messages API上的属性是 IObservable。我的问题是,如果在返回过滤响应的IObservable之前收到响应消息(即m.RequestId == requestId),我认为用户将看不到它并且不知道操作已完成。

有没有办法正确地做到这一点?

public IObservable<bool> DoAsyncRequest() 
    { 
     Observable.Defer(delegate 
     { 
      int requestId = GenerateRequestId(); 

      this.api.DoApiRequest(requestId); 

      return this.api.Messages 
       .Where(m => m.RequestId == requestId) 
       .Take(1) 
       .Timeout(DefaultTimeout); 

     }); 
    } 

回答

3

首先,返回一个IObservable来实现异步方法是绝对没问题的。

其次,如果它是DoApiRequest方法揭开序幕,通过Messages发出值的过程,你可以订阅的消息首先调用使用CreateWithDisposable

public IObservable<bool> DoAsyncRequest() 
{ 
    return Observable.CreateWithDisposable<bool>(observer => 
     {  
      var disposable = this.api.Messages 
       .Where(m => m.RequestId == requestId) 
       .Take(1) 
       .Timeout(DefaultTimeout); 
       .Subscribe(observer); 

      int requestId = GenerateRequestId(); 

      this.api.DoApiRequest(requestId); 

      return disposable; 

     }); 
} 

另外的方法之前,你似乎访问无论api对象是什么类,您也可以更改DoApiRequest以返回一个冷观察值,即可能会取消Messages属性,而是在DoApiRequest方法上返回IObservable。

注意

如果我的假设,DoApiRequest方法确实揭开序幕,通过邮件发出值的过程是正确的,那么你会得到,如果这种方法被称为多次奇怪的结果。一次呼叫可能会收到意欲返回另一个呼叫的消息。如果您能够,我会亲自考虑替代解决方案。