Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: для новичков > Хранение данных в переменной


Автор: Nerfair 24.7.2012, 22:16
Добрый день, получаю от сервера данные вида 

Код

{ "error" : 0, "quotes" : [ { "id" : 1, "text" : "Цитата 1"}, { "id" : 2, "text" : "Цитата 2"}, { "id" : 3, "text" : "Цитата 3"} ] }


Дальше их сохраняю в result 
Код

function getQuotes() {
    var xhr = new XMLHttpRequest();
    xhr.open("GET", "url", true);
    xhr.setRequestHeader('Accept-Encoding', 'gzip');

    xhr.onreadystatechange =
            function() {
                if (xhr.readyState == xhr.DONE) {
                    if (xhr.status == 200) {
                        var result = JSON.parse(xhr.responseText);

                        Производим какие либо действия ...
                }
            }
    xhr.send();
}


И допустим если я хочу вывести пользователю только "Цитата 1" и забыть об этом тто просто вместо "Производим какие либо действия ..." напишу
Код

alert(result["quotes"][0]["text"];


Но я хочу что бы по нажатию кнопки выводилось сначала "Цитата 2" потом "Цитата 3" и так, сколько там этих цитат будет.

Пишу функцию 

Код

function alertNextQuote(id) {
    result["quotes"][id]["text"];
}


Которой мы будем передавать след. значение. Но это функция result наш не знала, не слышала о нем и слышать ничего не хочет. А переписать getQuotes по такому типу и подключаться каждый раз к серверу, помоему не очень хорошо, когда нам в первый раз уже отдали все цитаты/тексты. Вопрос, каким образом при вызове getQuotes сохранить наш ответ в какую нибудь глобальную переменную что бы потом с ней работать из любой другой функции?

Автор: Aliance 25.7.2012, 09:55
Конечно, ведь переменная result - локальная, её область видимости ограничивается анонимной функцией.
Решение: объявляем глобальную переменную и ей и присваиваем значение.
Код

// объявляем глобальную переменную
var result;

function getQuotes() {
    // ...
    xhr.onreadystatechange = function() {
                if (xhr.readyState == xhr.DONE) {
                    if (xhr.status == 200) {
                        // присваиваем данные глобальной переменной
                        result = JSON.parse(xhr.responseText);
                        // Производим какие либо действия ...
                }
            }
    // ...
}



Кстати, alertNextQuote не возвращает никаких данных. Наверное нужно сделать так:
Код

function alertNextQuote(id) {
    return (typeof result["quotes"][id] != 'undefined') ? result["quotes"][id]["text"] : '---';
}

Автор: Nerfair 25.7.2012, 13:49
Спасибо, Aliance  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)