return
}
- let deps: Dep[] = []
+ const run = (dep: Dep | undefined) => {
+ if (dep) {
+ if (__DEV__) {
+ dep.trigger({
+ target,
+ type,
+ key,
+ newValue,
+ oldValue,
+ oldTarget,
+ })
+ } else {
+ dep.trigger()
+ }
+ }
+ }
+
+ startBatch()
+
if (type === TriggerOpTypes.CLEAR) {
// collection being cleared
// trigger all effects for target
- deps = [...depsMap.values()]
+ depsMap.forEach(run)
} else {
const targetIsArray = isArray(target)
const isArrayIndex = targetIsArray && isIntegerKey(key)
key === ARRAY_ITERATE_KEY ||
(!isSymbol(key) && key >= newLength)
) {
- deps.push(dep)
+ run(dep)
}
})
} else {
- const push = (dep: Dep | undefined) => dep && deps.push(dep)
-
// schedule runs for SET | ADD | DELETE
if (key !== void 0) {
- push(depsMap.get(key))
+ run(depsMap.get(key))
}
// schedule ARRAY_ITERATE for any numeric key change (length is handled above)
if (isArrayIndex) {
- push(depsMap.get(ARRAY_ITERATE_KEY))
+ run(depsMap.get(ARRAY_ITERATE_KEY))
}
// also run for iteration key on ADD | DELETE | Map.SET
switch (type) {
case TriggerOpTypes.ADD:
if (!targetIsArray) {
- push(depsMap.get(ITERATE_KEY))
+ run(depsMap.get(ITERATE_KEY))
if (isMap(target)) {
- push(depsMap.get(MAP_KEY_ITERATE_KEY))
+ run(depsMap.get(MAP_KEY_ITERATE_KEY))
}
} else if (isArrayIndex) {
// new index added to array -> length changes
- push(depsMap.get('length'))
+ run(depsMap.get('length'))
}
break
case TriggerOpTypes.DELETE:
if (!targetIsArray) {
- push(depsMap.get(ITERATE_KEY))
+ run(depsMap.get(ITERATE_KEY))
if (isMap(target)) {
- push(depsMap.get(MAP_KEY_ITERATE_KEY))
+ run(depsMap.get(MAP_KEY_ITERATE_KEY))
}
}
break
case TriggerOpTypes.SET:
if (isMap(target)) {
- push(depsMap.get(ITERATE_KEY))
+ run(depsMap.get(ITERATE_KEY))
}
break
}
}
}
- startBatch()
- for (const dep of deps) {
- if (__DEV__) {
- dep.trigger({
- target,
- type,
- key,
- newValue,
- oldValue,
- oldTarget,
- })
- } else {
- dep.trigger()
- }
- }
endBatch()
}