Во-первых, совершенно нормально возвращать 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 и вместо этого возвращать IObservable в методе DoApiRequest.
Примечание
Если я прав, предполагая, что метод DoApiRequest запускает процесс, который генерирует значения через сообщения, то вы получите странные результаты, если этот метод вызывается несколько раз. Один вызов может получить сообщения, которые должны были быть возвращены для другого вызова. Я бы лично посмотрел на альтернативное решение, если бы вы могли.