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()
的第二个调用。