Предотвратить повторное получение GET в цикле при использовании setTimeout

0

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

Я использую JQuery GET для получения веб-страницы.

Мой код

<script>
        function g() {
            document.body.bgColor = 'green';
        }
function r() {
            document.body.bgColor = 'red';
        }


 $(document).ready(function(){

     while(1)
     {
    $.get("http://localhost:8080/t.html", function( data ){
        setTimeout'g()',10000);

        setTimeout('r()',data*1000);

        });



     }

 });
    </script>

Проблема: каким-то образом seTimeout вызывает продолжение цикла. К моменту, когда страница ждет несколько секунд, генерируются сотни запросов GET. Мне нужен полный процесс для замораживания, пока код ждет заданное время. Мой браузер обнаруживает этот непрерывный цикл из-за большой активности и просит его убить.

Пожалуйста, помогите мне разобраться.

  • 1
    Добро пожаловать в удивительный мир асинхронности ! Вы не можете сделать это. Вам нужна рекурсия вместо этого.
  • 1
    Почему вы используете while(1)
Показать ещё 1 комментарий
Теги:
settimeout
get

3 ответа

0
Лучший ответ

Попробуй это,

$(function(){
  r();
});
function r(){    
    var timeOut = 5000;
    if(document.body.bgColor=='green'){
         document.body.bgColor = 'red';
           timeOut = 10000;
    }else{
        document.body.bgColor = 'green';        
    }    
    setTimeout(r,timeOut);
}

ДЕМО: http://jsfiddle.net/Hnuy8/

0

пожалуйста, посмотрите

 <script>
            function g() {
                document.body.bgColor = 'green';
            }
            function r() {
                document.body.bgColor = 'red';
            }


     $(document).ready(function(){

        function changeBG()
        {
         $.get("http://localhost:8080/t.html", function( data )
         {
               setTimeout('g()',10000);
               setTimeout('r()',data*1000);
               changeBG();
         });

        }
     changeBG();
     });

     </script>
0

setTimeout не будет замораживать вашу функцию while, потому что ее асинхронный. Он будет просто ждать и выполнять g() истечении заданного времени.

setInterval(function() {
    $.get("http://localhost:8080/t.html", function( data ){
     if(data=="green") g(); 
     else r();
    });
},10000);

это будет выполнять GET-запрос каждые 10 секунд и установить фон зеленым, когда data зеленые, в противном случае - красным.

Я не совсем понимаю, чего вы хотите достичь, поэтому вам нужно немного изменить это.

  • 0
    данные содержат значение, зеленый должен остаться столько секунд
  • 0
    и когда вы хотите снова запустить запрос get? потому что если вы хотите запустить его сразу после того, как фон станет красным, то вы увидите красный только во время запроса + ваши 10000 секунд, которые вы хотите подождать для g() (должно быть в общей сложности 10100 мс), это то, что вы имеете в виду ?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню