Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 以单例模式使用Axios.js为对象提供一次服务_Javascript_Asynchronous_Promise_Axios_Es6 Promise - Fatal编程技术网

Javascript 以单例模式使用Axios.js为对象提供一次服务

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

我使用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 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变量可能对其不可用。