使用 promise 和闭包作用域进行延迟加载
Lazy loading with promise and closure scope
我需要制作异步和延迟加载模块来获取一些配置值。与 promise 相关的闭包变量作用域是否有一些限制?
给定以下模块,该模块定义了一个加载程序函数,该函数使用 promises 执行异步加载并将配置存储到模块范围,以实现延迟加载,从而避免每次都加载不必要的配置。
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);
});
闭包作用域和 promises 是不是我遗漏了什么?或者这种方法是否可行?还有什么选择?
您的缓存模块工作正常。但是在您的测试中,您会立即使两者 "API calls" 。所以两个 cc() 调用都会在另一个更新它之前测试 if (!config)
。一旦一个调用能够 return 并更新 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);
我需要制作异步和延迟加载模块来获取一些配置值。与 promise 相关的闭包变量作用域是否有一些限制?
给定以下模块,该模块定义了一个加载程序函数,该函数使用 promises 执行异步加载并将配置存储到模块范围,以实现延迟加载,从而避免每次都加载不必要的配置。
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);
});
闭包作用域和 promises 是不是我遗漏了什么?或者这种方法是否可行?还有什么选择?
您的缓存模块工作正常。但是在您的测试中,您会立即使两者 "API calls" 。所以两个 cc() 调用都会在另一个更新它之前测试 if (!config)
。一旦一个调用能够 return 并更新 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);