Rx features
part of kovenant-rx
Addon project for converting back and forth between Kovenant
Promise
s and rx Observable
s.
ToPromise
Any Observable
can be turned into a Promise
but understand that there is a fundamental difference between the two.
A Promise
represents a single value that either is successful or failed. An Observable
on the other hand represents
a stream of values which results in the following possible states:
- emit nothing.
- emit an error.
- emit completed without data
- emit completed after single value
- emit completed after multiple values
- emit multiple values but never completed
To convert from an Observable
to a Promise
you simply do:
val values = arrayOf(1, 2, 3, 4, 5)
val observable = Observable.from(values)
val promise = observable.toPromise()
By default toPromise()
will create a promise that will resolve successful with the first emitted value. It will
resolve as failed if there are no values emitted but the Observable
emits completed. This will thus lead to:
- emit nothing - promise doesn't complete
- emit an error - promise resolves as failed, if no other value was emitted
- emit completed without data - promise resolves as failed
- emit completed after single value - promise resolves successful with value
- emit completed after multiple values - promise resolves successful with first value
- emit multiple values but never completed - promise resolves successful with first value
EmitStrategy
By default toPromise()
resolves successful with the first emitted value. If you'd rather resolve by the last emitted
value you can change the behaviour by calling:
val promise = observable.toPromise(strategy = EmitStrategy.LAST)
EmptyPolicy
By default toPromise()
resolves as failed if the Observable
is completed but hasn't emitted a value. To control
the behaviour of the promise when the Observable
is empty you can create one of the following EmptyPolicies:
//resolve with value
EmptyPolicy.resolve (42)
//resolve with factory value
EmptyPolicy.resolve { 42 }
//reject with eception
EmptyPolicy.reject(Exception())
//reject with exception factory
EmptyPolicy.reject { Exception() }
And you can use them like this:
val promise = observable.toPromise(emptyPolicy = EmptyPolicy.resolve (42))
There is also a shorthand for this common case, so you can always resolve successful with a default value:
val promise = observable.toPromise(42)
//or with a factory
val promise = observable.toPromise() { 42 }
ToListPromise
Instead of converting an Observable
to a single value we can also simply put al te results in a List
. This is as
simple as:
val promise = observable.toListPromise()
The only requirement for this to work is that the Observable
actually emits completed at some point in the
future.
ToObservable
To turn a Promise
into an Observable
you can simply call toObservable()
. Note that by default the
Observable
is observed on the callback Dispatcher
of the Promise
in question.