![](/img/trans.png)
[英]How to access out of scope variables in Promise.then (similar to closure)
[英]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.