Доступ к переменной вне области видимости (JavaScript)

1

Я пытаюсь получить доступ к переменной за пределами области действия функции. Я пытаюсь получить доступ к цене за пределами функции. Должен ли я ждать окончания запроса, или у меня нет доступа к цене?

        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);
Теги:
function

3 ответа

3
Лучший ответ

У вас нет доступа к переменной 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);
1

Наряду с var httpRequest... попробуйте установить var price = null

Насколько известно вашему JS-документу, "цена" как переменная не существует вне области processRequest().

Использование "use strict" в верхней части документа сделает проблемы, связанные с этим, легче увидеть =)

0

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

Существует два типа синхронного и асинхронного запроса (подробнее здесь), и всегда нужно, чтобы асинхронные запросы имели большую производительность. В вашем случае цена зависит от ответа на запрос, вы должны дождаться ответа. Вы можете сделать это двумя способами

  1. Добавьте значок обработки в пользовательский интерфейс, пока не получите ответ (для запроса async)
  2. Использовать синхронный запрос

Ещё вопросы

Сообщество Overcoder
Наверх
Меню