У меня есть необходимость сделать асинхронный и ленивый модуль загрузки, чтобы получить некоторые значения конфигурации. Есть ли какое-то ограничение в области видимости переменной закрытия по отношению к обещаниям?
Учитывая следующий модуль, который определяет функцию загрузчика, которая выполняет асинхронную загрузку с обещаниями и сохраняет конфигурацию в область видимости модуля, чтобы реализовать отложенную загрузку и, таким образом, избежать загрузки конфигурации, ненужной каждый раз.
const configModule = () => {
let config;
const loader = () => {
return new Promise((resolve, reject) => {
if(!config) {
setTimeout(() => {
const loadedValues = {foo: 'this be config', bar: 'OK?'};
console.log('config loaded', loadedValues);
resolve(loadedValues);
}, 1);
}
else {
console.log('config already loaded');
resolve(config);
}
}).then(res => {
console.log('loader then', res);
config = res;
return config;
})
};
return {
loader: loader
};
};
Со следующим клиентским кодом конфигурация загружается, но всегда свежо, то есть она не кэшируется, ленивая загрузка не работает.
const cc = configModule();
cc.loader().then(result => {
console.log('1', result);
});
cc.loader().then(result => {
console.log('2', result);
});
Есть ли что-то, чего мне не хватает в прицеле и обещаниях здесь? Или этот подход даже осуществим? Какая альтернатива?