scrivito
Version:
Scrivito is a professional, yet easy to use SaaS Enterprise Content Management Service, built for digital agencies and medium to large businesses. It is completely maintenance-free, cost-effective, and has unprecedented performance and security.
47 lines (40 loc) • 1.24 kB
text/typescript
import { Streamable, runAndCatchException } from 'scrivito_sdk/common';
import {
LoadableState,
LoadingSubscriber,
capture,
} from 'scrivito_sdk/loadable';
import { observe } from 'scrivito_sdk/state';
export type StateStream<T> = Streamable<LoadableState<T>>;
export function observeAndLoad<T>(loadableExpression: () => T): StateStream<T> {
return new Streamable((observer) => {
const loadingSubscriber = new LoadingSubscriber();
const subscription = observe(() =>
capture(() => runAndCatchException(loadableExpression))
).subscribe((captured) => {
captured.subscribeLoading(loadingSubscriber);
const outcome = captured.result;
observer.next(
outcome.errorThrown
? {
meta: {
error: outcome.error,
incomplete: captured.incomplete,
outdated: captured.outdated,
},
}
: {
value: outcome.result,
meta: {
incomplete: captured.incomplete,
outdated: captured.outdated,
},
}
);
});
return () => {
subscription.unsubscribe();
loadingSubscriber.unsubscribe();
};
});
}