работаем над некоторым getJSON и ждем до конца - PullRequest
0 голосов
/ 25 февраля 2012

У меня есть скрипт на какой-то getJSON, помогите пожалуйста с решением.

$.getJSON('data1_get.php', {dbase: 'file1', param: '0'}, function(data_1) {
  $.getJSON('data2_get.php', {dbase: 'file2', param: '1'}, function(data_2) {
    for (var i=0; i<data_1.length; i++) { // about 4 rows
      for (var k=0; k<data_2.length; k++) { // about 7 rows
        if (data_1[i].type == data_2[k].type) {
          if (data_2[k].switch=="1") { // possible many process
            // check.php needed time about 3 seconds for 1 process
            $.getJSON('check.php', {param: data_2[k].turnOn}, function(data_3) {
              // not work
              if (data.status) {
                alert('working for '+data_2[k].title);\n";
              }
            });
          }
        }
      }
    }
  });
});

мой вопрос: как я могу заставить его ждать и не продолжать, пока мы не получим все обратные вызовы от запросов ajax?

Спасибо!

Ответы [ 4 ]

0 голосов
/ 25 февраля 2012

Также взгляните на jQuery.deferred(), поскольку это может вам помочь.

0 голосов
/ 25 февраля 2012

Вы можете использовать $.ajax и async: false, как объяснено, например. здесь:

Однако, посмотрите на документацию:

где (для async параметра) это говорит, как и ожидалось:

Обратите внимание, что синхронные запросы могут временно блокировать браузер, отключая любые действия, когда запрос активен.

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

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

0 голосов
/ 25 февраля 2012

По сути, вы захотите использовать обратные вызовы.

В jQuery это может выглядеть примерно так:

$.ajax("/someresource", {
    success: function() {
       $.ajax("/somethingelse", {
           success: function() {
               alert("This happens after the request completes with a 200!");
           }
       });
    }
});

Обратитесь к jQuery Ajax docs для получения дополнительной информации. Помните, что такие функции, как get, post и getJSON будут подчиняться этой функции, поэтому они будут вести себя аналогично.

0 голосов
/ 25 февраля 2012

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

...