| 482 | } |
| 483 | |
| 484 | export function effect<T = any>( |
| 485 | fn: () => T, |
| 486 | options?: ReactiveEffectOptions, |
| 487 | ): ReactiveEffectRunner<T> { |
| 488 | if ((fn as ReactiveEffectRunner).effect instanceof ReactiveEffect) { |
| 489 | fn = (fn as ReactiveEffectRunner).effect.fn |
| 490 | } |
| 491 | |
| 492 | const e = new ReactiveEffect(fn) |
| 493 | if (options) { |
| 494 | extend(e, options) |
| 495 | } |
| 496 | try { |
| 497 | e.run() |
| 498 | } catch (err) { |
| 499 | e.stop() |
| 500 | throw err |
| 501 | } |
| 502 | const runner = e.run.bind(e) as ReactiveEffectRunner |
| 503 | runner.effect = e |
| 504 | return runner |
| 505 | } |
| 506 | |
| 507 | /** |
| 508 | * Stops the effect associated with the given runner. |