Статическая переменная в модуле ES6 (инициализируется только один раз) - PullRequest
0 голосов
/ 26 октября 2019

У меня есть следующий код, который является разумной реализацией Redux длиной менее 20 строк. Я хочу, чтобы state, beforeSetStateCallbacks и afterSetStateCallbacks были инициализированы только один раз при первом импорте модуля. Я действительно хочу, чтобы этот код был максимально коротким и был в одном файле. Есть ли лучший способ сделать это, который не требует загрязнения объекта window глобальной переменной?

let state
let beforeSetStateCallbacks
let afterSetStateCallbacks

if (!window.REDUCS_INITIALISED) {
  window.REDUCS_INITIALISED = 1
  state = {}
  beforeSetStateCallbacks = []
  afterSetStateCallbacks = []
}

export const beforeSetState = (fn) => beforeSetStateCallbacks.push(fn)
export const afterSetState = (fn) => afterSetStateCallbacks.push(fn)

export const setState = async (key, value) => {
  for (const fn of beforeSetStateCallbacks) await fn(key, value)
  state[key] = value
  for (const fn of afterSetStateCallbacks) await fn(key, value)
}

export const getState = (key) => {
  return state[key]
}

1 Ответ

1 голос
/ 26 октября 2019

Код верхнего уровня модуля ES6 будет запущен только один раз, когда модуль будет импортирован в первый раз. Последующий импорт модуля просто получит ссылку на экспортируемые товары. Таким образом, вы можете просто изменить код, чтобы безоговорочно создать 3 переменные на верхнем уровне:

const state = {}
const beforeSetStateCallbacks = []
const afterSetStateCallbacks = []
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...