2012-01-07 3 views
2

Я искал и нашел удобный ответ, но я не могу его найти.Использование функции обратного вызова ... JQuery .Get

У меня есть функция jquery .get ajax для запуска чего-то, для выполнения требуется около 10 секунд, потому что у меня есть ожидание в php doc. Я хочу запустить его снова через 10 секунд, поэтому в основном, когда функция ajax завершается. Im мышления, используя функцию обратного вызова, но я понятия не имею, как структурировать его, или я должен использовать время цикла или .. им потерял ...

Heres мой код, который я до сих пор

function listen(callbackFn) { 
    $.get('thread.php?tag=<? echo $tag ?>&username=<? if($_SESSION['loggedin']=='true'){echo $_SESSION['username '];} ?>', function(data) { 
     $('#chats').append(data); 
     callbackFn; 
    }); 
}; 
+0

Вы хотите, чтобы один и тот же вызов .get() еще раз после того, как оригинал вызов? Это то, что повторяется каждые десять секунд на протяжении всей жизни веб-страницы? –

ответ

1

Это должно работать для вас:

(function repeat_request(){ 
    $.get('thread.php?tag=<? echo $tag ?>&username=<? if($_SESSION['loggedin']=='true'){echo $_SESSION['username'];} ?>', 
     function(data) { 
      $('#chats').append(data); 
      repeat_request(); 
     } 
    ); 
})(); 

Функция называется repeat_request выполняется, как только предыдущий запрос завершается успешно. Обратите внимание, что если какой-либо запрос не работает (скажем, интернет-пользователь временно отключается), запрос перестанет повторяться. Если вы хотите, чтобы повторять вы должны использовать .complete() вместо успеха, как это:

(function repeat_request(){ 
    $.get('thread.php?tag=<? echo $tag ?>&username=<? if($_SESSION['loggedin']=='true'){echo $_SESSION['username'];} ?>', 
     function(data) { 
      $('#chats').append(data); 
     } 
    ).complete(repeat_request); 
})(); 
+0

Я не могу заставить его работать, я использую firebug, и кажется, что он просто запускается один раз, а затем он не работает вызовите рекурсивную функцию. – Robert

+0

О, подождите, я думаю, что это работает! – Robert

0

Я думаю, что вам лучше всего обернуть, что в функцию и называть его рекурсивно:

function poll() { 
    $.get('thread.php?tag=<? echo $tag ?>&username=<? if($_SESSION['loggedin']=='true'){echo $_SESSION['username'];} ?>', function(data) { 

      $('#chats').append(data); 
      poll(); 
    }); 
} 

poll(); 

Это будет в значительной степени опрос навсегда каждый раз, когда возвращается вызов Ajax.

1

Поместите код в функцию и вызвать его рекурсивно с таймаут 10 секунд:

function do() { 
    $.get('...', function (data) { 
     // data processing... 

     setTimeout(do, 10000); 
    }); 
} 

do(); 
+0

Предполагая, что это то, что нужно, мне больше нравится, когда клиентский браузер использует setInterval, чем ожидающий php 10 секунд. –

+0

ну ... я должен заставить php ждать 10 секунд..им делать длинный опрос. Но, в этом случае, я все еще могу поместить функцию в блок успеха правильно? – Robert

+0

@scott Кажется, что обработка PHP занимает некоторое время (что может быть связано с ожиданием из-за латентности или любого количества других факторов), а следующий вызов должен быть начат через 10 секунд после завершения предыдущего. Вот что это делает. И это имеет смысл ИМО. Интервал может быстро привести к постоянным запросам на сервер без паузы между ними. – deceze

0

Вы можете попробовать:

function listen() 
{ 
$.get('thread.php?tag=<?php echo $tag ?>&username=<?php 
if($_SESSION['loggedin']=='true'){echo $_SESSION['username'];} ?>', 
    function(data) { 
     $('#chats').append(data); 
     setTimeout(listen,100); // prevent recursive call 
    } 
); 
}; 
Смежные вопросы