Как приостановить код JQuery на несколько миллисекунд? - PullRequest
2 голосов
/ 05 апреля 2011

Я использую функции jQuery Ajax для автоматического обновления моей базы данных через cron. Поскольку нужно обновить много строк, я бы хотел приостановить код на несколько миллисекунд на каждую итерацию. Как лучше всего это сделать?

Вот пример моего кода:

<?php

    $zdroje = $db->select('zdroje', 'id!=1');

    echo "<script type='text/javascript'>\n
            $(document).ready(function() {\n"; 

    foreach($zdroje as $zdroj) {

    echo "$.post( '/adminator/menu/2zajezdy/tools/01otnXml/requests.php', { 'updateXML': '".$zdroj['id']."' }, function(data) {
        // pause here!
    });\n";

    } // end: foreach

    echo "});\n</script>\n";

?>

Ответы [ 6 ]

6 голосов
/ 05 апреля 2011

Есть только два способа сделать это:

  1. Использовать setTimeout (например, 10 миллисекунд):

    setTimeout(function () {
        $.post( '/adminator/menu/2zajezdy/tools/01otnXml/requests.php', { 'updateXML': '".$zdroj['id']."' }, function(data) {
            // do stuff here!
        });
    }, 10);
    
  2. Дляцикл (это взлом, поэтому это не является предпочтительным):

    for(i = 0; i < 500; i++);

4 голосов
/ 05 апреля 2011

Я предлагаю вам взглянуть на новую систему отсрочки jQuery.Вот хороший учебник: http://www.erichynds.com/jquery/using-deferreds-in-jquery/

По сути, вы можете создать обещание «удержания», например:

function hold(delay){
    var dfd = $.Deferred();

    setTimeout(function(){
        dfd.resolve();
    }, delay);

    return dfd.promise();
}

Затем соедините вместе ajax-запросы следующим образом:

$.when($.post('yourLongUrlHere'))
    .then(hold(500))
    .then($.post('anotherUrl'))
    .then(hold(500))
    .then($.post('somethingElse.php'));

Это будет делать каждый запрос AJAX в порядке, ожидая 500 миллисекунд между каждым.

Должен обработать то, что вы спросили о проблеме.

3 голосов
/ 05 апреля 2011

вы можете попробовать функцию .delay () ...

http://api.jquery.com/delay/

1 голос
/ 05 апреля 2011

Полагаю, вы хотите создать цепочечный вызов вместо простого списка. То есть что вы получите сейчас:

$.post(...)
$.post(...)
...
$.post(...)

Вы бы хотели получить что-то вроде этого:

$.post(url1, function(data) {
    setTimeout(function() {
        $.post(url2, function(data) {
            setTimeout(function() {$.post(url3)}, 500);
        });
    }, 500);
});

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

Редактировать : Попробуйте сгенерировать это так

$code = "%s";
foreach($sources as $source) {
   $part = "$.post( '/adminator/menu/2zajezdy/tools/01otnXml/requests.php', { 'updateXML': '${source['id']}' }, function(data) {
      setTimeout(function() {
         %s
      }, 500);
   });"
   $code = sprintf($code, $part);
}
$code = sprintf($code, '');
1 голос
/ 05 апреля 2011

Возможно, неуклюжий подход заключается в использовании метода JavaScript setTimeout (), но я бы порекомендовал вам изучить функции jQuery, $. AjaxComplete () , $. AjaxStart () и $. AjaxStop () .

0 голосов
/ 05 апреля 2011

Вы не можете приостановить движок JavaScript от обработки кода. JS имеет код, который выполняется асинхронно - например, ответ на запрос AJAX возвращается и выполняется функция обратного вызова.

setTimeout - ваш лучший друг в отношении задержки выполнения определенной функции.

//Executes an alert exactly 1 second later
setTimeout(function() {
   alert('hello world'); 
}, 1000);
...