Javascript 具有promise和closure作用域的延迟加载

Javascript 具有promise和closure作用域的延迟加载,javascript,promise,closures,lazy-loading,Javascript,Promise,Closures,Lazy Loading,我需要创建异步和延迟加载模块来获取一些配置值。与承诺相关的闭包变量范围是否存在一些限制 给定以下模块,该模块定义了一个加载程序函数,该函数使用承诺执行异步加载,并将配置存储到模块范围,以实现延迟加载,从而避免每次加载不必要的配置 const configModule = () => { let config; const loader = () => { return new Promise((resolve, reject) => { if(!c

我需要创建异步和延迟加载模块来获取一些配置值。与承诺相关的闭包变量范围是否存在一些限制

给定以下模块,该模块定义了一个加载程序函数,该函数使用承诺执行异步加载,并将配置存储到模块范围,以实现延迟加载,从而避免每次加载不必要的配置

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)
。只要一个调用能够返回一个值并更新
配置
,缓存就会开始工作

const cc = configModule();

cc.loader().then(result => {
  console.log('1', result);
});
cc.loader().then(result => {
  console.log('2', result);
});
const configModule=()=>{
让配置;
常量加载器=()=>{
返回新承诺((解决、拒绝)=>{
如果(!config){
设置超时(()=>{
常量加载值={
foo:'这是配置',
酒吧:“好吗?”
};
log('config loaded',loadedValues);
解析(加载的值);
}, 1);
}否则{
log('配置已加载');
解析(配置);
}
})。然后(res=>{
log('loader then',res);
config=res;
返回配置;
})
};
返回{
装载机:装载机
};
};
const cc=configModule();
cc.loader().then(结果=>{
console.log('1',结果);
});
setTimeout(()=>cc.loader()。然后(结果=>{
console.log('2',结果);

}), 100);setTimeout
和调用堆栈,但现在看看它,很清楚为什么它不起作用
setTimeout
将函数添加到调用堆栈的底部,并将控制权交给下一个函数,在本例中,下一个函数是对
cc.loader()
的第二个调用。