实现 effect 返回 runner
在本小节中,我们将会实现 effect 返回 runner
1. 测试样例
it('runner', () => {
// runner 就是 effect(fn) 返回一个函数,执行该函数就相当于重新执行了一次传入 effect 的 fn
// 同时执行 runner 也会将 fn 的返回值返回
let foo = 1
const runner = effect(() => {
foo++
return 'foo'
})
expect(foo).toBe(2)
// 调用 runner
const r = runner()
expect(foo).toBe(3)
// 获取 fn 返回的值
expect(r).toBe('foo')
})
2. 实现
这个该如何实现呢?其实也是非常简单的:
// effect.ts
class ReactiveEffect {
private _fn: any
constructor(fn) {
this._fn = fn
}
run() {
activeEffect = this
const res = this._fn()
// [runner] return 运行的值
return res
}
}
// other code ...
export function effect(fn) {
const _effect = new ReactiveEffect(fn)
_effect.run()
// [runner]: 在这里将 run 方法 return 出去
// 但是要注意 this 指向问题,所以可以 bind 后 return 出去
return _effect.run.bind(_effect)
}
再次测试一下,测试样例就可以通过了
