我正在阅读redux源代码,而ensureCanMutateNextListeners函数引起了我的注意。来源中的评论解释得很好,我能理解。
但是,我觉得它有点复杂,(即两个侦听器集合并在操作集合之前调用ensureCanMutateNextListeners),我在想是否可以简化并仍然解决原始问题。以下是我能想到的两个选项:
要解决的原始问题:
在调度时保持稳定的侦听器,避免因调度时侦听器更改而导致的不确定问题
选项#1:不可变的集合
更改时,设置新的侦听器数组,而不是修改现有的数组。在发送调度的任何时刻,它都会获得一个监听器数组,这是一个快照,永远不会改变。
let currentListeners = [] // just one listeners collections
// in dispatch
const listeners = currentListeners
for (let i = 0; i < listeners.length; i++) {
listener()
}
// when subscribe a listener, just push
currentListeners = [...currentListeners, listener]
// when unsubscribe a listener, just get rid of
currentListeners.splice(index, 1)
选项#2:在调度中切片 在发送调度的任何时刻,它首先获得侦听器的克隆,它就像一个快照。
let currentListeners = [] // just one listeners collections
// in dispatch
const listeners = currentListeners.slice()
for (let i = 0; i < listeners.length; i++) {
const listener = listeners[i]
listener()
}
// when subscribe a listener, just push
currentListeners.push(listener)
// when unsubscribe a listener, just get rid of
currentListeners = currentListeners.filter(x=>x === listener)
IMO,上述解决方案之一比redux源中的原始实现简单得多。我想知道我是否想念任何事情,欢迎任何想法。
参考问题:React Redux source function ensureCanMutateNextListeners?