trace
由于状态之间可能存在复杂的依赖计算关系,为了更好的调试状态的变化,AutoStore
提供了一个trace
函数来帮助调试AutoStore
的状态操作。
trace
函数的签名如下:
ts
type StateTracker= {
stop:()=>void,
start(isStop?:(operate:StateOperate)=>boolean):Promise<StateOperate[]>
}
function trace(fn: ()=>any,operates?:WatchListenerOptions['operates']):StateTracker
同步跟踪
ts
import { createStore } from "@autostorejs/react"
const { state, trace } = createStore({
a:1,
b:2,
c:(scope)=>scope.a+scope.b
})
// 创建跟踪器
tracker = trace(()=>{
state.a = 1
state.b = 2
})
// 开始跟踪,结束后返回操作列表
const operates = await tracker.start()
实际运行效果如下:
异步跟踪
如果要跟踪的是异步函数,则会复杂一些,如下例:
c
是一个异步计算属性,依赖于a
和b
,当a
或b
变化时,c
会重新计算
看起来好像没什么问题,跟踪日志如所预期那样,但是实际情况会比较复杂,再看以下示例:
从上例中我们可以看到操作日志中set b
后没有看到对set d.value
的操作。
这是因为d
是一个异步计算属性,d
的计算是在c
的计算完成后才会开始的,
对d
的计算是在跟踪函数的执行后的下一次异步事件循环中进行的,而此时跟踪函数已经执行完毕了,所以就无法跟踪到对d
的操作。
显然,我们预期是在state.b = 20
之后,能跟踪到其派生的一系列操作日志的。
因此,这种情况下,我们需要为start()
提供一个预期的结束函数,来判断是否停止跟踪,如下:
- 如果因为某些原因,我们无法接收
set d.value
的操作,可以调用tracker.stop()
方法来停止跟踪。
提示
trace
方法仅在开发时进行调试时使用。