#javascript #npm
#javascript #npm
Вопрос:
У меня есть импортированная библиотека из npm, и некоторые ее части необходимо инициализировать перед использованием, упрощенная версия кода в библиотеке:
export let locale = () => { throw new Error("Must init locale"); }
export initLocale(userLocaleFunction) {
locale = userLocaleFunction;
}
export checkLocale() {
console.log(locale());
}
Но при вызове библиотеки следующим образом:
lib = require("lib");
lib.initLocale(() => { return "en" });
lib.checkLocale(); // works as expected: "en"
lib.locale(); // Throws "Must init locale";
lib.locale
действует так, как будто он не был инициализирован. Я не могу initLocale()
вернуть языковой стандарт, мне нужно, чтобы он был в переменной lib.locale
Возможно ли инициализировать переменную таким образом?
Комментарии:
1. Попробуйте изменить «let» на «const». Действительно, let — это объявление с ограниченной областью действия. также вы переназначаете locale внутри initLocale, так что, возможно, это просто переопределено
2. есть ли у вас контроль над импортированным пакетом?
3. @Vinz243 У меня есть контроль над ним — я переношу его из более старых версий js — это означает, что большая часть кода зависит от lib.locale, чтобы выглядеть так, как он выглядит
4. @Webwoman Я отредактировал сообщение, чтобы более четко осветить проблему — я инициализирую переменную и ожидаю, что она вернет «en», но вместо этого я получаю начальное значение — «Необходимо инициализировать locale»
5. вы пытались изменить
let
наvar
?
Ответ №1:
Кажется, что при инициализации переменной внутри библиотеки она находится только в области библиотек.
В моем первом решении я просто вернул значение:
export initLocale(userLocaleFunction) {
locale = userLocaleFunction;
return locale;
}
Но затем понял, что это создает новую проблему: что, если locale будет изменен внутри библиотеки или, что еще хуже, за ее пределами?
В духе избежания двух источников правды я в конечном итоге выбрал это:
locale = undefined;
export initLocale(userLocaleFunction) {
locale = userLocaleFunction;
}
export getLocale() {
if (locale === undefined) {
throw new Error("Uninitialized locale");
}
return locale;
}
Этот код выполняет is initialized
проверку, в которой я нуждался вначале, и выдает значение с одним источником достоверности.