Упорядочение асинхронных событий JavaScript

У меня есть следующий код:

$("#submit_financials").live('click', function(event){
    event.preventDefault();

    // using serialize here to pass the POST variables to the django view function
    var serialized_data = $("#financials_filter_form").serialize()

    $.post("/ajax/custom_filter/", serialized_data, function(response){
        // create a graph
    });
    $.post("/ajax/force_download/", serialized_data, function(response){
        alert('hello');
    });

});

Однако, когда я делаю этот код, я получаю ответ "привет".before график. Почему это происходит? И как бы я изменил это так, чтобы я сначала получил график?

 bhamlin05 июн. 2012 г., 20:01
@RustyTheBoyRobot - это действительно неточное утверждение. Javascript - это полностью синхронный язык, но AJAX-вызовы - нет.
 Jonathan M05 июн. 2012 г., 20:01
Javascriptwill делать вещи в определенном порядке, но AJAX по определению является асинхронным.
 gdoron05 июн. 2012 г., 20:01
@RustyTheBoyRobot. Это так не правда!javascript is a synchronous language only!
 Lucero05 июн. 2012 г., 20:04
Простой ответ заключается в том, что оба запроса запускаются один за другим и выполняются одновременно;custom_filter кажется, требуется больше времени для обработки на сервере, так чтоforce_download возвращается первым и вызывает ваш обратный вызов.
 RustyTheBoyRobot05 июн. 2012 г., 19:59
JavaScript не является синхронным языком; использовать обратные вызовы

Ответы на вопрос(3)

). Если это невозможно / практически невозможно, вы можете использовать переменную с взаимной областью действия в качестве флага (измените значение в функциях обратного вызова ответа, а затем используйте setTimeout и recursion (или setInterval), чтобы продолжить поиск изменений в вашей переменной & quot; flag & quot; и когда вы увидите, что это изменится, тогда выведите следующий запрос $ .post

Решение Вопроса

вы никогда не узнаете, какая функция запускается \ заканчивается первым ...

Подумайте об асинхронных операциях, таких как приказание группе людей пройти 1 милю, знаете ли вы, кто закончит первым? (Да, Джон Скит, затем Чак Норрис ...)

Вы можете использовать callack для запуска второго ajax:

$.post("/ajax/custom_filter/", serialized_data, function(response) {
    // create a graph
    ...
    ...

    $.post("/ajax/force_download/", serialized_data, function(response) {
        alert('hello');
    });
});​
 David54205 июн. 2012 г., 20:02
Спасибо, очень четкое объяснение!

If you want to generate graph before alert but want both calls to be completed.

$.when (
   $.post("/ajax/custom_filter/", serialized_data),
   $.post("/ajax/force_download/", serialized_data)
).done(function(a1,  a2){
    /* a1 and a2 are arguments resolved for the 
    custom_filter and force_download post requests  */
   var customFilterResponse = a1[2]; 
   /* arguments are [ "success", statusText, jqXHR ] */

   //generate graph.

   alert('hello');
});
 05 июн. 2012 г., 20:14
+1 Отложенный - определенно способ, если два запроса не зависят друг от друга, но оба должны быть выполнены перед выполнением какого-либо действия.
 05 июн. 2012 г., 20:15
@RubensMariuzzo Ну, я все еще учусь, и это[ "success", statusText, jqXHR ] материал новый и выучил его, читая документы & gt;. & lt;
 05 июн. 2012 г., 20:12
Несколько часов назад я чувствовал, что я действительно JQuery Ninja, так как я прочитал этот ответ о$.when(...) и я чувствовал, чтоwhat is that?
 05 июн. 2012 г., 20:06
и здесь я собирался опубликовать ответ, реализующий это вручную. Как-то никогда не знал о$.when(), Спасибо!
 05 июн. 2012 г., 20:41
@gdoron Если вы пролистаете ядро, оно создает отложенный объект и применяет его к объекту jqXHR, затем отображает ошибку успеха и полные обратные вызовы на отложенные обратные вызовы .done .fail и .always. Я не знал, что таким способом можно просто применить отложенный объект к существующему объекту. Интересно!

Ваш ответ на вопрос