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