Как загрузить исходные данные до запуска остальной части кода JavaScript? - PullRequest
1 голос
/ 18 февраля 2011

Я не могу понять, как загрузить с сервера необходимые исходные данные, которые используются остальной частью моего кода JavaScript после $(document).ready(function(){.

Конкретно:

В index.html У меня есть

<head>
<script type="text/javascript" src="js/data.js"></script>
... 

$(document).ready(function(){
        initialize();
        console.log(grantsData);

...

Возвращается на консоль Firebug "grantsData не определена"

В файле data.js У меня есть

var grantsData;
$.getJSON( "js/mysql_query_grants2.php", function(json){
        alert("got SQL data as json");
        grantsData = json;
                console.log(grantsData);
                }

, и это возвращает ожидаемой консоли.

Вопросы:

Выводит ли это, что .getJSON () не получил возможность завершить возвращение результата grantsData до того, как код запустился в index.html?

Как я могу изменить, чтобы все мои начальные ключи grantsData были загружены, после initialize(), НО до любого другого JavaScript, который зависит от этих данныхв процессе?

Какая альтернатива не-AJAX для getJSON ()?

Ответы [ 2 ]

3 голосов
/ 18 февраля 2011

Оставаться асинхронным.

$(document).ready(function(){
        // 1

        initialize_everything(function() {
            // 6
            console.log(grantsData);
            ...
        });

        // 4
  }

В data.js:

function initialize_everything(callback) {
    // 2
    $.getJSON( "js/mysql_query_grants2.php", function(json){
        // 5
        // ...

        // NOW we have everything, so report back
        callback();
        }
    }

    // 3
}

Выводит ли это, что .getJSON () не получилшанс завершить возвращение результата grantsData до запуска кода в index.html?

Он асинхронный, обрабатывает свои данные (т. е. запускает переданный ему код), как только приходит ответ сервера,Тем временем ваш браузер продолжает выполнять JavaScript, поэтому обратный вызов $(document).ready() вызывается, даже если этот другой, не связанный AJAX-запрос, возможно, еще не выполнен.Если вы полагаетесь на определенное время ваших обратных вызовов, ваше приложение может вести себя по-разному в разных браузерах или зависать случайно.

Интенсивное использование замыканий (т. Е. Локальных function() {}, которые передаются и вызываются позже) - идиоматический способ JavaScript работать с асинхронным потоком программ.

Edit : чтобы прояснить это, я добавил возможный порядок выполнения к приведенному выше образцу.

0 голосов
/ 19 февраля 2011

Если вам не нужна прямая зависимость от функций, вы можете использовать пользовательские события для вашего объекта gransdata и запускать другие вещи при его изменении или заполнении.

вот хорошая ссылка на этом.

...