繁体   English   中英

具有承诺和关闭范围的延迟加载

[英]Lazy loading with promise and closure scope

我需要制作异步和延迟加载模块以获取一些配置值。 与承诺相关的闭包变量作用域是否存在某些限制?

给定以下模块,该模块定义了一个加载器函数,该函数执行带有promise的异步加载并将配置存储到模块范围中,以实现延迟加载,从而避免每次都不必要地加载配置。

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

在这里我缺少闭包范围和承诺吗? 还是这种方法可行? 有什么选择?

您的缓存模块运行正常。 但是在测试中,您将立即进行两个“ API调用”。 因此,两个cc()调用都将在另一个if (!config)更新之前测试它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); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM