Single
The Single
class is similar to Flowable
, however instead of representing a stream of data with an unknown length, Single
represents a stream which will only ever produce a single value, and which is produced on demand (when subscribed). From a practical perspective Single
is a lazy, cancellable Promise that supports operators (e.g. map()
).
Examples
Network Request
This example creates a Single
that resolves to the result of an XHR request. The fetch
API does not support cancellation, so no cancel callback is passed to
onSubscribe()
. The user may still call cancel()
to ignore the fetch
results and stop onComplete()
or onError()
from being called.
const single = new Single((subscriber) => {
fetch('https://...').then((resp) => {
resp.json().then(
(data) => subscriber.onComplete(data),
(error) => subscriber.onError(error)
);
});
subscriber.onSubscribe();
});
single.subscribe({
onComplete: (data) => console.log(data),
onError: (error) => console.error(error),
onSubscribe: (cancel) => {
/* call cancel() to stop onComplete/onError */
},
});
Timer
This example creates a Single
that resolves to a string after a timeout, passing a
cancellation callback to stop the timer in case the user cancels the Single
:
const single = new Single((subscriber) => {
const id = setTimeout(() => subscriber.onComplete('hello!'), 250);
// Cancellation callback is optional
subscriber.onSubscribe(() => clearTimeout(id));
});
single.subscribe({
onComplete: (data) => console.log(data),
onError: (error) => console.error(error),
onSubscribe: (cancel) => {
/* call cancel() to stop onComplete/onError */
},
});
API
constructor (function)
class Single<T> {
constructor(source: Source<T>)
}
type Source<T> = (subscriber: Subscriber<T>) => void;
type Subscriber<T> = {
onComplete: (data: T) => void,
onError: (error: Error) => void,
onSubscribe: (cancel: CancelCallback) => void,
};
type CancelCallback = () => void;
subscribe() (method)
This method connects the Single
to a subscriber of values. Unlike Flowable
, with Single
a subscribe
also implicitly indicates demand. PartialSubscriber
differs from Subscriber
only in that methods are optional.
subscribe(subscriber: PartialSubscriber<T>): void
type PartialSubscriber<T> = {
onComplete?: (data: T) => void,
onError?: (error: Error) => void,
onSubscribe?: (cancel: CancelCallback) => void,
}
map() (method)
This method applies a transform function to values produced by this Single
. This is similar to
Array.prototype.map
, Observable.prototype.map
, etc.
map<U>(fn: (data: T) => U): Single<U>