I\'ve seen tons of examples on how to use the Observable.FromAsyncPattern() in the Rx Framework to simplify Async calls, but I\'m using an interface that doesn\'t use the st
Try Observable.Create()
, perhaps something like this:
public IObservable<Object> ObserveAllObjects()
{
return Observable.Create<Object>(
observer =>
() => GetAllObjects(objects => objects.ForEach(o => observer.OnNext(o))));
}
I like Observable.Create for this, but @dahlbyk answer is incorrect(misses completion and performs the action in the unsubscribe handler). Should be something like this:
IObservable<List<T>> FromListCallbackPattern<T>(
Action<Action<List<T>>> listGetter)
{
return Observable
.Create<List<T>>(observer =>
{
var subscribed = true;
listGetter(list =>
{
if (!subscribed) return;
observer.OnNext(list);
observer.OnCompleted();
});
return () =>
{
subscribed = false;
};
});
}
Also, since the originating API returns an entire list altogether, I don't see a reason to transform it to observable too early. Let the resulting observable return a list as well, and if a caller needs to flatten it, he can use .SelectMany
Func<IObservable<TRet>> FromListCallbackPattern(Action<Action<List<TRet>>> function)
{
return () => {
// We use a ReplaySubject so that if people subscribe *after* the
// real method finishes, they'll still get all the items
ret = new ReplaySubject<TRet>();
function((list) => {
// We're going to "rebroadcast" the list onto the Subject
// This isn't the most Rx'iest way to do this, but it is the most
// comprehensible :)
foreach(var v in list) {
ret.OnNext(v);
}
ret.OnCompleted();
});
return ret;
};
}
Now, you can do something like:
var getAllUsers = FromListCallbackPattern(mClient.GetAllUsers);
getAllUsers().Subscribe(x => /* ... */);