scheduler?: Scheduler
onTrack?: Debugger
onTrigger?: Debugger
+ onStop?: () => void
}
export interface ReactiveEffectOptions {
scheduler?: Scheduler
onTrack?: Debugger
onTrigger?: Debugger
+ onStop?: () => void
}
export type Scheduler = (run: () => any) => void
effect.scheduler = options.scheduler
effect.onTrack = options.onTrack
effect.onTrigger = options.onTrigger
+ effect.onStop = options.onStop
effect.computed = options.computed
effect.deps = []
return effect
const newValue = runner()
if (options.deep || newValue !== oldValue) {
try {
- if (isFunction(cleanup)) {
+ // cleanup before running cb again
+ if (cleanup) {
cleanup()
}
- cleanup = cb(newValue, oldValue)
+ const _cleanup = cb(newValue, oldValue)
+ if (isFunction(_cleanup)) {
+ // save cleanup so it is also called when effect is stopped
+ cleanup = runner.onStop = _cleanup
+ }
} catch (e) {
// TODO handle error
// handleError(e, instance, ErrorTypes.WATCH_CALLBACK)