Использование Axios.js в шаблоне Singleton для однократного обслуживания объекта - PullRequest
0 голосов
/ 10 июля 2019

Я использую axios для возврата объекта JSON, необходимого для моего модуля.Это довольно большой объект, поэтому я хотел бы использовать шаблон синглтона для значительного сокращения запросов к этому объекту каждый раз, когда он требуется.

Например:

// 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 асинхронны, поэтому строка return myJsonObject; будет выполняться до того, как запрос axios будет завершен, и до того, как переменная myJsonObject будет назначена извлеченным данным response.data;.Итак, myJsonObject всегда будет null.

Я хочу только один раз извлечь myJsonObject и сохранить его в переменной, которая может быть передана другим клиентским модулям, если онуже существует.Если его не существует, я хочу получить его и сохранить.

Как мне реструктурировать эту функцию для достижения этой цели?

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Просто верните объект обещания. В коде клиента вам просто нужно вызвать объект обещания.

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);
0 голосов
/ 10 июля 2019

Как насчет использования нового синтаксиса 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)
    }
}
...