2016-10-24 6 views
0

У меня есть пул, где я храню данные и перебираю элементы по циклам.

Предел - 3, поэтому я получаю первые предметы trhee, три других предмета и остальные предметы.

ajax.php ожидает секунд, что происходит из массива пулов. Таким образом, первый цикл 1,2,4 должен быть освобожден после 4 секунд, второй - 2,1,4 также 4 секунд, а остальные 3,1 - 3 секунд.

Проблема в том, что $.when сразу же получает вызовы ajax, даже если у них нет responseText. I'vd попытался добавить .apply, но в этом случае мой браузер замораживает ...

Он регистрирует все запросы как объекты, но без ответа. Текст. Когда 4 сек регистрируется, через 4 секунды к нему присоединяется responseText.

Как я могу это решить?

var queue = { 
    limit: 3, 
    pool: [ 
     1, 2, 4, 
     2, 1, 4, 
     3, 1 
    ] 
}; 


function startAjaxRequests() { 
    var requests = []; 
    while (queue.pool.length > 0) { 
     for (var i = 0; i < queue.limit; i++) { 
      if (typeof queue.pool[i] !== 'undefined') { 
       requests.push($.get('/ajax.php', {secs: queue.pool[i]}, function() {})); 
      } 
     } 
     $.when($, requests).done(function() { 
     //$.when.apply(null, requests).done(function() { 
      $.each(arguments, function (key, value) { 
       console.log(value); 
      }); 
      queue.pool.splice(0, queue.limit); 
      requests = []; 
     }); 
    } 
    console.log('finish...'); 
} 

startAjaxRequests(); 

Если я использую так:

var a1 = $.get('/ajax.php', {secs: 1}); 
var a2 = $.get('/ajax.php', {secs: 2}); 
var a3 = $.get('/ajax.php', {secs: 4}); 
$.when(a1, a2, a3).done(function() { 
    $.each(arguments, function (key, value) { 
     console.log(value); 
    }); 
}); 

, то он работает, как положено, и утешает результаты через 4 секунды.

ответ

1

I'vd пытался добавить .Не

Это было бы правильно.

, но в этом случае мой браузер замерзает ...

Это из-за вашего while цикла. Ajax (и $.when) вызывает ваши обратные вызовы асинхронно, поэтому вы уже входите в следующую итерацию до того, как ваш пул будет пустым, и это фактически бесконечный цикл. Работая с асинхронным кодом, вам необходимо использовать рекурсивный подход вместо синхронного цикла.

function startAjaxRequests() { 
    if (queue.pool.length > 0) { 
     var requests = []; 
     for (var i = 0; i < queue.limit; i++) { 
      if (typeof queue.pool[i] !== 'undefined') { 
       requests.push($.get('/ajax.php', {secs: queue.pool[i]})); 
      } 
     } 
     $.when.apply($, requests).then(function() { 
      $.each(arguments, function (key, value) { 
       console.log(value); 
      }); 
      queue.pool.splice(0, queue.limit); 
      startAjaxRequests(); // recurse! 
     }); 
    } else { 
     console.log('finish...'); 
    } 
} 
+0

Спасибо. Я включил функцию, потому что знал, что это должно быть рекурсивным, глупым, я не знаю, как я могу это забыть. Огромное спасибо. Работает как шарм. – vaso123

0

$.when - асинхронный вызов, ваша очередь может быть пуста перед вызовом второго запроса на обслуживание.

+0

Нет, все в порядке с этим. Он регистрирует все запросы как объект, но без responseText. 4 сек записывается в журнал, и через 4 секунды к нему присоединяется «responseText». – vaso123

+0

затем проверьте со стороны сервера, если есть какие-либо проблемы, также не забудьте проверить ответ от журнала клиента. –

+0

Отсутствие проблемы на стороне сервера. Это ответы. – vaso123

Смежные вопросы