Javascript 以单例模式使用Axios.js为对象提供一次服务
我使用axios返回模块所需的JSON对象。这是一个相当大的对象,所以我想使用singleton模式来显著减少每次需要这个对象时对它的请求 例如:Javascript 以单例模式使用Axios.js为对象提供一次服务,javascript,asynchronous,promise,axios,es6-promise,Javascript,Asynchronous,Promise,Axios,Es6 Promise,我使用axios返回模块所需的JSON对象。这是一个相当大的对象,所以我想使用singleton模式来显著减少每次需要这个对象时对它的请求 例如: // This variable holds the JSON object once it is retrieved by axios var myJsonObject = null; function fetchMyJsonObject() { if (!myJsonObject) { // use axios here
// This variable holds the JSON object once it is retrieved by axios
var myJsonObject = null;
function fetchMyJsonObject() {
if (!myJsonObject) {
// use axios here to fetch
axios.get('/objects/my-json-object')
.then(response => {
myJsonObject = response.data;
});
}
return myJsonObject;
}
这里的问题很明显:axios的请求是异步的,因此返回myJsonObject;行将在axios请求完成之前运行,并且在为myJsonObject变量分配获取的数据响应.data;之前运行;。因此,myJsonObject将始终为null
我希望只获取一次myJsonObject,并将其存储到一个变量中,如果该变量已经存在,则该变量可以提供给其他客户机模块。如果它不存在,那么我想把它取出来并保存起来
如何重新构造此函数以实现此目的?只需返回promise对象即可。在客户机代码中,您只需要调用promise对象
var getJsonPromise = null;
function fetchMyJsonObject() {
if (!getJsonPromise ) {
// use axios here to fetch
getJsonPromise = axios.get('/objects/my-json-object');
}
return getJsonPromise;
}
客户端代码
fetchMyJsonObject();
getJsonPromise.then(response => // do whatever you want with json data);
使用新的ES语法怎么样
// This variable holds the JSON object once it is retrieved by axios
var myJsonObject = null;
async function fetchMyJsonObject() {
try {
if (!myJsonObject) {
myJsonObject = await axios.get('/objects/my-json-object');
}
return myJsonObject;
}
catch(error) {
console.log(error)
}
}
只需将承诺存储在该变量中。无论如何,您都需要从函数返回一个承诺。@Bergi,您介意演示这段代码吗?不,myJsonObject是异步获取的,因此无法可靠地返回。相反,缓存/返回axios返回的承诺。get.仍然不是。始终返回缓存的承诺。@Roamer-1888好的,现在祈祷吧。现在呢?如果这是错误的,你介意在上面的代码中指出我需要更改什么吗?就是这样,你知道了!谢谢你的回答。它给了我新的想法。客户机代码可能位于不同的模块中,因此getJsonPromise变量可能对其不可用。