Как подтвердить, что выполнено более одного AJAX-вызова?

#ajax #jquery #jqgrid

#ajax #jquery #jqgrid

Вопрос:

 $(document).ready(function() {
    $("#list1").jqGrid({
        url: 'example1.php',
        /*balabala...*/
        gridComplete: function() {

        }
    });

    $("#list2").jqGrid({
        url: 'example2.php',
        /*balabala...*/
        gridComplete: function() {

        }
    });

    /*I want to do something here, but the above grids must be both complete first.*/
    Something...
});
  

Как мне следует поступить? Спасибо!

Ответ №1:

Самый простой способ — поместить ваше «что-то» в gridComplete обратные вызовы, но заставить два обратных вызова проверить, что другой завершен. Что-то в этом роде:

 function do_something_wonderful() {
    // This is the awesome stuff that you want to
    // execute when both lists have loaded and finished.
    // ...
}

var one_done = false;
function done_checker() {
    if(one_done) {
        // The other one is done so we can get on with it.
        do_something_wonderful();
    }
    one_done = true;
}

$("#list1").jqGrid({
    //blah blah blah
    gridComplete: done_checker
});
$("#list2").jqGrid({
    //blah blah blah
    gridComplete: done_checker
});
  

Это прекрасно распространяется на более чем два списка с парой небольших изменений:

  • используйте var how_many_done = 0; вместо one_done .
  • Сделайте how_many_done; вместо one_done = true; и переместите его в начало done_checker .
  • Замените if(one_done) на if(how_many_done == number_of_tasks) где number_of_tasks указано, сколько задач AJAX у вас есть.

Общая версия будет выглядеть примерно так:

 var number_of_tasks = 11; // Or how many you really have.
var how_many_done   = 0;
function done_checker() {
      how_many_done;
    if(how_many_done == number_of_tasks) {
        // All the AJAX tasks have finished so we can get on with it.
        do_something_wonderful();
    }
}
  

Еще лучшая версия завершила бы состояние закрытием:

 var done_checker = (function(number_of_tasks, run_when_all_done) {
    var how_many_done = 0;
    return function() {
          how_many_done;
        if(how_many_done == number_of_tasks) {
            // All the AJAX tasks have finished so we can get on with it.
            run_when_all_done();
        }
    }
})(do_something_wonderful, 11);
  

Комментарии:

1. @Cynial: Я добавил еще одно обновление, которое изолирует дополнительное состояние, хотя это может быть немного чересчур.

2. Не говорите так, это действительно помогает мне! 🙂

3. @Cynial: Я только что добавил еще одну опцию, которая может оказаться полезной, или это может быть больше защиты / сообразительности, чем вам нужно (т. Е. «многовато»). Рад быть полезным.

Ответ №2:

В данный момент вы должны использовать отложенные объекты jquery.