Получение данных с веб-сервера с помощью jQuery

Вот сценарий: я получаю данные из базы данных через веб-сервер. На основе этих данных страница отправляет другой запрос на тот же сервер для выполнения какого-либо действия. Упрощенная структура выглядит следующим образом:

var datacon;
$.post('method',function(data){
   datacon = data;
   // populating some tags;
}) // end of post
//some other staff happening;
$.post('other',{datacon}, function(env){
...// taking data from populated tags
   $("div").load(env);
...
}) // end of post

Это происходит каждый раз, когда пользователь заходит на страницу. Этот код не работает в том смысле, что datacon пуст при открытии страницы. Но если я обновлю его один или два раза, он начнет работать. Второй $.post работает отлично, проверено сотни раз. Я изменил первый $.post на $.get, но это не помогает.

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

p.s. сервер CherryPy.


person Rustam Aliyev    schedule 08.08.2012    source источник


Ответы (2)


Поскольку эти вызовы являются асинхронными, возможно, что второй вызов выполняется до завершения первого. Чтобы убедиться, что они выполняются в правильном порядке, поместите второй вызов ajax в функцию done() в конце первого. Таким образом, второй будет запущен только после завершения первого.

Вот пример из проекта, над которым я работаю:


    $("#leftcolumn").activity();
    $.ajax({
            type: "GET",
            url: "/search",
            cache: false,
            data: {searchterm: searchterm}
            }).done( function(reply) {
                $("#leftcolumn").activity(false);
                showSearchResults(reply);
                });

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

person Mike Johnston    schedule 08.08.2012
comment
Майк, не могли бы вы объяснить немного больше? Что такое функция done()? - person Rustam Aliyev; 08.08.2012
comment
Я считаю, что то, что предлагает Майк, может быть достигнуто путем перемещения второго POST в функцию обратного вызова первого. - person ach; 09.08.2012

Функции обратного вызова выполняются асинхронно, то есть после получения данных с сервера. Ваш второй POST, вероятно, выполняется до того, как будет возвращен ответ от первого POST. Вы можете изменить свой первый пост () на ajax () и установить «асинхронный» на «ложный». См. http://api.jquery.com/jQuery.ajax/.

Вышеупомянутое немного неуклюже — в идеале все, что зависит от результата вызова AJAX, должно быть передано в метод обратного вызова. Например, попробуйте переместить второй POST внутрь обратного вызова первого. Установка флагов, которую вы пытаетесь сделать, может считаться запахом кода.

person ach    schedule 08.08.2012