Первый день изучаю JS. Задача: спарсить курс биткоина в долларах, спарсить курс доллара в рублях, перемножить значения.
Проблема в том, что при вызове фунции Btc2Rub() вылетает ошибка "неизвестная переменная", но это логично, т.к. переменный объявляю в функциях.
Пробовал объявить "глобальные переменные" для btccourse и usdcourse, в надежде, что в функциях они перезапишутся, затем перемножатся. Объявлял так: в первых строчках кода var btccourse = 0;, но переменная не перезаписывалась, оставаясь нулем.
Как мне решить эту проблему?
$(document).ready(function() {
getBtc();
getUsd();
Btc2Rub();
});
function getBtc() {
$.get(
"https://api.coindesk.com/v1/bpi/currentprice.json",
function(data) {
data = JSON.parse(data);
btccourse = data.bpi.USD.rate_float;
console.log("BTC = " + btccourse + " Usd");
}
)
};
function getUsd() {
$.get(
"https://www.cbr-xml-daily.ru/daily_json.js",
function(data) {
data = JSON.parse(data);
usdcourse = data.Valute.USD.Value;
console.log("USD = " + usdcourse + " Rub");
}
)
};
function Btc2Rub() {
rubcourse = btccourse * usdcourse;
console.log(rubcourse)
}
Для выполнения асинхронного HTTP запроса используется метод $.ajax, который лежит в основе всех Ajax
запросов отправляемых при помощи jQuery
.
Объект jqXHR
, возвращаемый методом $.ajax
реализует интерфейс Promise
, дающий ему все свойства, методы и поведение Promise
. Представляет результат успешного или неудачного завершения асинхронной операции.
Метод $.when принимает произвольное число промисов, и возвращает один Deferred объект. Обработчик done
получит результаты каждого промиса, в вашем вопросе - два результата.
$(document).ready(function() {
var btc = get('https://api.coindesk.com/v1/bpi/currentprice.json');
var usd = get('https://www.cbr-xml-daily.ru/daily_json.js');
$.when(btc, usd).done(printResult);
});
function get(url) {
return $.ajax({
url: url,
dataType: 'json'
});
}
function printResult([btc], [usd]) {
var btccourse = btc.bpi.USD.rate_float;
var usdcourse = usd.Valute.USD.Value;
var rubcourse = btccourse * usdcourse;
// Распечатаем результат.
result.textContent = rubcourse;
}
<pre id="result"></pre>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
Вариант с использованием "сахара" в виде async/await
, плюс обработка ошибок через try...catch
.
$(document).ready(function() {
Btc2Rub()
.then(function(rubcourse) {
// Распечатаем результат.
result.textContent = rubcourse;
});
});
function get(url) {
return $.ajax({
url: url,
dataType: 'json'
});
}
async function Btc2Rub() {
try {
const btc = await get('https://api.coindesk.com/v1/bpi/currentprice.json');
const usd = await get('https://www.cbr-xml-daily.ru/daily_json.js');
const btccourse = btc.bpi.USD.rate_float;
const usdcourse = usd.Valute.USD.Value;
return btccourse * usdcourse;
} catch (error) {
console.error(error);
}
}
<pre id="result"></pre>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
Как-то так:
$(document).ready(function() {
$.when(getBtc(), getUsd()).then(Btc2Rub);
});
function getBtc() {
return $.get(
"https://api.coindesk.com/v1/bpi/currentprice.json",
function(data) {
data = JSON.parse(data);
return data.bpi.USD.rate_float;
}
)
};
function getUsd() {
return $.get(
"https://www.cbr-xml-daily.ru/daily_json.js",
function(data) {
data = JSON.parse(data);
return data.Valute.USD.Value;
}
)
};
function Btc2Rub(btccourse, usdcourse) {
var rubcourse = btccourse * usdcourse;
console.log(rubcourse)
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Мне нужно передать поля формы get параметром, при этом группы полей например:
У меня в блоке есть картинка со свойством "position", которое имеет значение "asbolute"Картинка намного больше блока, и мне бы хотелось, чтобы блок...
Footer находится посередине страницы и никуда не двигаетсяПодскажите, пожалуйста, в чем проблема?