gpt4 book ai didi

javascript - 带有 promise 和闭包范围的延迟加载

转载 作者:行者123 更新时间:2023-12-02 23:50:46 25 4
gpt4 key购买 nike

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

给定以下模块,该模块定义了一个加载器函数,该函数使用 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);
});

这里的闭包范围和 promise 是否缺少一些东西?或者这种方法是否可行?有什么替代方案吗?

最佳答案

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

关于javascript - 带有 promise 和闭包范围的延迟加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55658263/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com