Javascript как сохранить данные Fetch в глобальной переменной - PullRequest
1 голос
/ 14 апреля 2020

Я делаю приложение для конвертации валюты, которое использует API. Когда я выбираю API, переменная data имеет JSON, который мне нужен. Но когда я сохраняю его в глобальную переменную, и console.log что, вывод будет null.

КОД:

const API_URL = 'SECRET';

let currency_json = null;

//Makes the request
async function getJSONdata(url) {
    loading.style.display = '';

    fetch(url)
        .then(res => res.json())
        .then(data => {
            console.log(data); //Outputs the JSON. For some reason it gives null
            currency_json = data;
        })
        .catch(err => console.log(err))

    loading.style.display = 'none';   

}

//Calls the function
getJSONdata(API_URL);

console.log(currency_json); //Outputs null

Также это не не дают никаких ошибок. И я прочитал решение другого человека на другом сайте (где-то добавить Timeout), проблема в том, что они не сказали, где и как его поставить.

1 Ответ

3 голосов
/ 14 апреля 2020

Вы делаете async звонок. Fetch получает данные, но они не доступны сразу.

Вам нужно подождать, пока данные будут доступны. Внутри then вы ждете, пока он будет доступен, и поэтому он работает.

Вы можете использовать async / asyn c, но кажется, что вы делаете вызов на уровне модуля, а это недоступно там. Вы должны переместить свой код для выполнения из обратного вызова обещания (затем метода).

То, что вы слышали о setTimeout, является формой long polling, вы можете реализовать ее примерно так:

const longPollCallback = () => {
 if (currency_json) {
  console.log(currency_json)
 } else {
  setTimeout(longPollCallback, 500)
 }
}

setTimeout(longPollCallback, 500)

Но вы должны полагаться на then, async/await вместо длинного опроса.

...