Redux源函数的替代实现ensureCanMutateNextListeners?

时间:2017-08-17 22:57:24

标签: redux

我正在阅读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?

0 个答案:

没有答案