跳转到内容

同步模式

@ChangeState 默认总是返回 Promise(即使原方法是同步的)。开启 sync: true 后,同步方法会直接返回同步值。

默认行为

@ChangeState('idle', 'ready')
init() { // 同步方法
return 42
}
const r = obj.init()
// r 是 Promise<number>,需要 await

AFSM 这样设计是为了「调用方总是 await」的一致体验。但有些场景(如构造后立即初始化)希望同步返回。

开启 sync

@ChangeState('idle', 'ready', { sync: true })
init() {
return 42
}
const r = obj.init()
// r 直接是 42

错误行为

sync 模式下,错误会抛出而非 reject:

@ChangeState('idle', 'ready', { sync: true })
init() {
throw new Error('bad')
}
try {
obj.init()
} catch (e) {
// e 是 FSMError
}

配合 ignoreError: true,错误会被返回而非抛出:

@ChangeState('idle', 'ready', { sync: true, ignoreError: true })
init() {
throw new Error('bad')
}
const r = obj.init()
// r 是 FSMError 实例

缓存命中

如果当前已是 to 状态,重复调用会直接返回缓存:

@ChangeState('idle', 'ready', { sync: true })
init() { return 42 }
const a = obj.init() // 42,状态变 ready
const b = obj.init() // 42,来自 [cacheResult],不重新执行

异步方法 + sync

sync: true异步方法(返回 Promise)的行为:

@ChangeState('idle', 'ready', { sync: true })
async fetch() {
return await api()
}
const r = await obj.fetch()
// r 是 api() 的结果(仍是 Promise,需 await)

sync 主要影响「原方法返回同步值时」的包装方式。异步方法仍然返回 Promise。

总结

sync原方法返回错误
false(默认)同步Promise.resolve(value)reject
false(默认)异步原 Promisereject
true同步valuethrow
true异步原 Promisereject

下一步