Я пытаюсь получить доступ к переменной за пределами области действия функции. Я пытаюсь получить доступ к цене за пределами функции. Должен ли я ждать окончания запроса, или у меня нет доступа к цене?
var httpRequest = new XMLHttpRequest();
httpRequest.open('GET', "https://api.iextrading.com/1.0/stock/aapl/quote", true);
httpRequest.send();
httpRequest.addEventListener("readystatechange", processRequest, false);
function processRequest(e) {
if (httpRequest.readyState == 4 && httpRequest.status == 200) {
response = JSON.parse(httpRequest.responseText);
console.log(response.latestPrice);
var lastPrice = response.latestPrice;
document.getElementById("StockPrice").innerHTML = lastPrice;
price = lastPrice;
}
}
document.write("outside: " + price);
У вас нет доступа к переменной price
за пределами этой области действия. Вместо этого вы можете указать цену возврата, а затем назначить вызов этой функции переменной. Например:
var price = processRequest();
Тем не менее, этот вызов будет асинхронным, поэтому вам придется либо сделать вызов document.write
из этой функции, либо вам придется настроить какое-то обещание или обратный вызов, чтобы гарантировать, что document.write
вызывается только после того, запрос завершен (и price
фактически присваивает значение).
Это может выглядеть примерно так:
function writeToDoc (price) {
document.write("outside: " + price);
}
function processRequest(e, cb) {
// request logic
if (httpRequest.readyState == 4 && httpRequest.status == 200) {
response = JSON.parse(httpRequest.responseText);
console.log(response.latestPrice);
var lastPrice = response.latestPrice;
document.getElementById("StockPrice").innerHTML = lastPrice;
price = lastPrice;
// Call callback function
cb(price);
}
}
httpRequest.addEventListener("readystatechange", processRequest.bind(this, writeToDoc), false);
Наряду с var httpRequest...
попробуйте установить var price = null
Насколько известно вашему JS-документу, "цена" как переменная не существует вне области processRequest().
Использование "use strict" в верхней части документа сделает проблемы, связанные с этим, легче увидеть =)
Прежде всего, если вы хотите получить доступ к любой переменной за пределами ее области в JS, тогда используйте закрытие. Я не вижу, где объявляется цена, если она глобальная, тогда это нормально в вашем случае.
Существует два типа синхронного и асинхронного запроса (подробнее здесь), и всегда нужно, чтобы асинхронные запросы имели большую производительность. В вашем случае цена зависит от ответа на запрос, вы должны дождаться ответа. Вы можете сделать это двумя способами