Ленивая загрузка с обещанием и объемом закрытия - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть необходимость сделать асинхронный и ленивый модуль загрузки, чтобы получить некоторые значения конфигурации. Есть ли какое-то ограничение в области видимости переменной закрытия по отношению к обещаниям?

Учитывая следующий модуль, который определяет функцию загрузчика, которая выполняет асинхронную загрузку с обещаниями и сохраняет конфигурацию в область видимости модуля, чтобы реализовать отложенную загрузку и, таким образом, избежать загрузки конфигурации, ненужной каждый раз.

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);
});

Есть ли что-то, чего мне не хватает в прицеле и обещаниях здесь? Или этот подход даже осуществим? Какая альтернатива?

1 Ответ

1 голос
/ 12 апреля 2019

Ваш модуль кеширования работает правильно. Но в вашем тесте вы сразу делаете оба «вызова API». Таким образом, оба вызова cc () будут проверять if (!config) до того, как другой обновит его. Как только один вызов сможет вернуться со значением и обновить config, кэш начнет работать.

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);
});
setTimeout(() => cc.loader().then(result => {
  console.log('2', result);
}), 100);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...