Итак, я пошел с использованием глобальной переменной, почему этот код возвращается с предупреждением «undefined»? - PullRequest
0 голосов
/ 12 августа 2011

Я хочу, чтобы данные, полученные из одной функции, отображались в другой. Мне сказали, что использование глобальной переменной позволит мне выполнить это Каков наилучший способ сохранить значение для использования в более поздней функции? Я слышал, что глобальные переменные - зло .

Вот что я попробовал. http://jsfiddle.net/8j947/17/

Когда я пытаюсь отобразить глобальную переменную как предупреждение, она возвращается как неопределенная (что может быть недоступно для просмотра в jsfiddle). Я думаю, это потому, что данные на самом деле не сохраняются, но я кодирую только 3 недели, так что я знаю. Если бы вы, ребята, могли бы помочь мне, показав мне, что я сделал неправильно, или предложив альтернативное решение, которое было бы замечательно.

Ответы [ 2 ]

0 голосов
/ 12 августа 2011

Это классическая ошибка при использовании асинхронного программирования. Вы больше не можете думать об одном пошаговом порядке выполнения: вызовите функцию a (), затем b (), затем c (). При использовании любой формы вызова ajax он обычно асинхронный. Это означает, что вызов функции только запускает ее выполнение.

Затем он будет работать в фоновом режиме, а остальная часть вашего javascript будет продолжать работать и завершиться. Затем, спустя некоторое время, вызов ajax завершится, и он вызовет свою функцию успеха. Только из этой функции успеха или любого другого кода, который вы вызываете из функции успеха, вы можете фактически использовать результаты своего вызова ajax. Итак, что вам по сути нужно сделать, это запустить вызов ajax, а затем ваш код javascript на данный момент завершается. Затем вы пишете функцию успеха, которая подхватит выполнение остальной части того, что вам нужно сделать, когда завершится вызов ajax. В этот момент у вас есть данные JSON, и вы можете делать с ними все, что захотите. Вы можете взять эти данные и вызвать другие функции, передав их им, чтобы они могли с ними работать.

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

Итак, если поток выполнения, который вы хотели сделать, был следующим:

a();
b();
getJSONdata();
c();
d();

Вы должны структурировать это так:

a();
b();
getJSONdata("xxx", function(data) {
    c(data);
    d();
})

function c(myData) {
    // do something with the passed in data
}

где c () и d () происходят в функции успеха при извлечении данных JSON, и они вызываются ТОЛЬКО после того, как данные доступны.

0 голосов
/ 12 августа 2011

Ваша функция оповещения внизу выполняется сразу после вызова getCrossDomainJson и до вызова функции обратного вызова, переданной в getCrossDomainJson.Поскольку свойство someProperty устанавливается внутри функции обратного вызова, когда вы ссылаетесь на него в предупреждении, оно еще не было установлено.

Дайте вашей функции оповещения имя и вызовите ее где-нибудь еще ПОСЛЕФункция обратного вызова завершена.

function getCrossDomainJson(url, callback) {
    $.ajax({
        url: "http://query.yahooapis.com/v1/public/yql?callback=?",
        data: {
            q: 'select * from xml where url="' + url + '"',
            format: "json"
        },
        dataType: "jsonp",
        success: callback
    });
}

var MyStatus = {};
getCrossDomainJson("http://xdiscgolfplanetx.channel-api.livestream-api.com/2.0/getstream", function(data) {
    // data is in JSON format:
    console.dir(data);
    if (data && data.query && data.query.results && data.query.results.channel) {
        var isLive = (data.query.results.channel.isLive);
        MyStatus.someProperty = data.query.results.channel.isLive;
    // alert (isLive)
        if (isLive == 'true') {
            alert ('working')
        }
        alertSomeProperty();            // now that the someProperty property has been set and MyStatus 
                                        //is global, you'll see that you can refer to it even outside of this block
    }
});

function alertSomeProperty(){
    alert (MyStatus.someProperty)
}
...