优化ObservableImpl
This commit is contained in:
@@ -176,7 +176,7 @@ export class ObservableImpl<T extends TNonFunctionProperties<T>> implements IObs
|
||||
this.notifyScheduled = false
|
||||
|
||||
// 全量订阅 —— 每个订阅单独 try/catch,避免一个错误阻塞其它订阅
|
||||
for (const fn of Array.from(this.listeners)) {
|
||||
for (const fn of this.listeners) {
|
||||
try {
|
||||
fn(this.state as unknown as T)
|
||||
} catch (err) {
|
||||
@@ -188,11 +188,11 @@ export class ObservableImpl<T extends TNonFunctionProperties<T>> implements IObs
|
||||
}
|
||||
|
||||
// 字段订阅:把同一个回调的多个 key 聚合到一次调用里
|
||||
const fnMap: Map<TObservableKeyListener<T, keyof T>, (keyof T)[]> = new Map()
|
||||
const fnMap: Map<TObservableKeyListener<T, keyof T>, Array<keyof T>> = new Map()
|
||||
for (const key of keys) {
|
||||
const set = this.keyListeners.get(key)
|
||||
if (!set) continue
|
||||
for (const fn of Array.from(set)) {
|
||||
for (const fn of set) {
|
||||
const existing = fnMap.get(fn)
|
||||
if (existing === undefined) {
|
||||
fnMap.set(fn, [key])
|
||||
@@ -212,7 +212,7 @@ export class ObservableImpl<T extends TNonFunctionProperties<T>> implements IObs
|
||||
result[k] = (this.state as Record<keyof T, unknown>)[k] as T[(typeof k) & keyof T]
|
||||
})
|
||||
// 调用时类型上兼容 TObservableKeyListener<T, K>,因为我们传的是对应 key 的 Pick
|
||||
fn(result as unknown as any) // 最后一处转换仅为满足 TypeScript 调用签名(不引入 any 到实现变量)
|
||||
fn(result as Pick<T, (typeof subKeys)[number]>)
|
||||
} catch (err) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.error("Observable keyListener error:", err)
|
||||
@@ -296,6 +296,7 @@ export class ObservableImpl<T extends TNonFunctionProperties<T>> implements IObs
|
||||
this.keyListeners.clear()
|
||||
this.pendingKeys.clear()
|
||||
this.proxyCache = new WeakMap()
|
||||
Object.freeze(this.state)
|
||||
}
|
||||
|
||||
/** 语法糖:返回一个可解构赋值的 Proxy */
|
||||
|
||||
Reference in New Issue
Block a user