JavaScript

Видимость переменной JavaScript

 fetch(`https://www.floatrates.com/daily/usd.json`) 
.then(response => response.json())
.then(response => {

var currency = JSON.stringify(response.usd.currency)
});

alert(currency); // ошибка вывода

Как сделать переменную "currency" видимой за пределами ferch ?

 alert(currency); 
  • за скобками не работает (за пределами видимости)
  • внутри fetch она работает

Подскажите, пожалуйста.
Вот пример при помощи async/await:
 async function eur_to_usd(){ 
const response = await fetch(`https://www.floatrates.com/daily/eur.json`);
const currencies = await response.json();
alert(`Euro to ${currencies.usd.name} conversion rate is ${currencies.usd.rate}.`);
};

eur_to_usd();
Если надо вызвать 1 раз то можно и так:
 (async function(){ 
const response = await fetch(`https://www.floatrates.com/daily/eur.json`);
const currencies = await response.json();
alert(`Euro to ${currencies.usd.name} conversion rate is ${currencies.usd.rate}.`);
})();
Всё должно быть в пределах асинхронной функции.

И ещё по ссылке https://www.floatrates.com/daily/eur.json нет свойства 'currency'. Так что исправь это ошибку...
Вячеслав Мамкин
Вячеслав Мамкин
23 960
Лучший ответ
Юрий Антошин Благодарю вас за эти примеры кода.

Вы прям потратили время , скопировали мой код , протестировали , улучшили и показали 2 рабочих / готовых примера.

Спасибо.
Даже если сделаешь так, как предложил предыдущий отвечающий, проблему это не решит. Да, переменная будет видна, но значения у currency в момент срабатывания alert не будет.

Твой alert сработает сразу после выполнения fetch - НЕ дожидаясь ответа сервера. А код, который присваивает значение currency, выполнится намного позже - ПОСЛЕ того, как ответ от сервера будет получен. Промисы нужны именно для того, чтобы разместить в них ВЕСЬ код, который должен быть выполнен после получения ответа сервера. И если хочешь сделать alert - помести его в промис:
 let currency;
fetch('https://www.floatrates.com/daily/usd.json')
.then(response => response.json())
.then(response => {
currency = JSON.stringify(response.usd.currency);
alert(currency);
});
Если хочешь, чтобы твой асинхронный код был похож на синхронный, используй не промисы, а async / await. Да, внутри них тоже промисы, но они замаскированы и внешне код выглядит как линейный.
Юрий Антошин Понял. Благодарю вас за развёрнутый ответ.

В моём скрипте маленькая ошибка. Там надо поменять response.usd.currency на response.eur.currency. Чтобы увидеть JSON-ответ.

Да, я попробовал скрипт человека выше. Не сработало.
И никаких ошибок, потому что переменная изначально будет в области видимости всего скрипта. Просто перезапишется при выполнении кода.
 var currency; 

fetch(`https://www.floatrates.com/daily/usd.json`)
.then(response => response.json())
.then(response => {

currency = JSON.stringify(response.usd.currency)
});

alert(currency);
Akjol Baigubenov
Akjol Baigubenov
53 245
Юрий Антошин Да я так пробовал.

Вместо ответа теперь приходит пустой alert.
 var currency = ''; 

fetch(`https://www.floatrates.com/daily/eur.json`)
.then(response => response.json())
.then(response => {

currency = JSON.stringify(response.usd.currency)
});

alert(currency);

Юрий Антошин В моём скрипте маленькая ошибка. Там надо поменять usd.json на eur.json. Чтобы увидеть результат JSON-ответа.

Но видимо alert() обязан быть внутри fetch.

По другому никак.