mst-effect
Version:
Designed to be used with MobX-State-Tree to create asynchronous actions using RxJS.
23 lines (22 loc) • 845 B
JavaScript
import { Subject } from 'rxjs';
import { take } from 'rxjs/operators';
import { addDisposer } from 'mobx-state-tree';
import { subscribe } from './utils';
export function dollEffect(self, factory) {
const payloadSource = new Subject();
const signalSource = new Subject();
const effect$ = factory(payloadSource.asObservable(), (value) => signalSource.next(value));
const subscription = subscribe(self, factory, effect$);
addDisposer(self, () => {
payloadSource.complete();
signalSource.complete();
subscription.unsubscribe();
});
return (payload, handler) => {
const promise = (typeof handler === 'function' ? handler(signalSource.asObservable()) : signalSource)
.pipe(take(1))
.toPromise();
payloadSource.next(payload);
return promise;
};
}