Синхронизация Javascript с запросами JSON - PullRequest
2 голосов
/ 21 мая 2011

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

Есть идеи?

Вот некоторый код: Проблема в том, что вторая строка выполняется перед первой (существует много вызовов аналогичных функций JSON).

$.getJSON(url, function(data){ $("#mycontent").append("..... stuff here...... create loads of dibs with class set to mydivclass"); });
...
$("div.mydivclass").hide();

К сожалению, я не могу использовать синхронное свойство ajax, потому что: «dataType:« jsonp »запросы не поддерживают синхронные операции»

Ответы [ 2 ]

3 голосов
/ 21 мая 2011

Если вы используете jQuery 1.5+, вы можете использовать deferreds для решения вашей проблемы:

function first_ajax_request() {
    return jQuery.ajax(
         // Your settings here
         success: success_function_1
    );
}

function second_ajax_request() {
    return jQuery.ajax(
         // Your settings here
         success: success_function_2
    );
}

function final_sucess_callback() {
    // Do all your display work.
}

jQuery.when(first_ajax_request(), 
            second_ajax_request()).then(final_success_callback);

Есть отличная статья на эту тему, о которой вы должны прочитатьа также Эрик Хиндс .Он приводит несколько примеров именно той проблемы, которую вы пытаетесь решить.

1 голос
/ 21 мая 2011

jquery-запросы по умолчанию асинхронизированы, поэтому ваш код не ожидает ответа, поэтому у вас нет гарантии, что код после запроса будет выполняться после ответа, поэтому вы можете установить синхронизацию запроса, установив для свойства async значение false, теперьзапрос синхронизирован, и вы можете гарантировать, что остальная часть кода будет выполняться после ответа от сервера, как это.

$.ajax({
   url: "page.php",
   processData: false,
   data: xmlDocument,,
   async:false,
   success: handleResponse
 });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...