Переберите ваши обратные вызовы и удалите нужную функцию (работает, если одна и та же функция зарегистрирована дважды). Вы можете сделать простой цикл for:
function unregister(fn) {
for (let i = callbacks.length - 1; i >= 0; i--) {
if (callbacks[i] === fn) {
callbacks.splice(i, 1)
}
}
}
Или вы можете использовать let
и заменить весь массив:
let callbacks = [];
function unregister(fn) {
callbacks = callbacks.filter(cb => cb !== fn)
}
Если вы хотите иметь возможность зарегистрироватьсяодна и та же функция более одного раза и сможет отменить их независимую регистрацию, тогда да, вам нужно отследить какой-то идентификатор.
Идентификатор может быть чем-то простым, например, увеличивающимся целым числом, и вы можете сохранитьони в другом массиве, в том же индексе функция находится в массиве обратных вызовов (это хэширование).
Примерно так:
const state = {}
const callbacks = []
const ids = []
let nextId = 0
const register = (fn) => {
const id = nextId
callbacks.push(fn)
ids.push(nextId)
nextId++
return () => {
// find the function position using the ids array:
const fnIndex = ids.findIndex(cbId => cbId === id)
if (fnIndex === -1) return // or throw something
// Now remove the element from both arrays:
callbacks.splice(fnIndex, 1)
ids.splice(fnIndex, 1)
}
}
Таким образом, функция отмены регистрации всегда ищетточный индекс, в котором находится id / fn.