js setInterval работает, но setTimeout не работает - PullRequest
3 голосов
/ 24 января 2012

Я узнаю о setTimeout против setInterval, и у меня есть setInterval для работы, но не setTimeout. например, это не работает:

<!DOCTYPE HTML>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>Brewery</title>
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
        <script type="text/javascript"> 
        function doNothing()
        {
            var t = "hello wolrd";
        }

        function poll(){
        $.ajax({
            //url: "http://192.168.0.11/"+Math.random(),
            url:"line-ajax.htm",
            contentType:"text/html",
            success: 'doNothing()'
        });
        }

        setTimeout(poll(),2000);
        </script>
        <link rel="stylesheet" type="text/css" href="http://www.highcharts.com/highslide/highslide.css" />
    </head>
    <body>
        <div id="container" style="width: 1200px; height: 500px; margin: 0 auto"></div>             
    </body>
</html>

но если я изменю только это

setTimeout(poll(),2000);

до

setInterval(poll(),2000);

он будет делать запрос ajax каждые 2 секунды ...

что происходит?

--- редактировать Я также пытался setTimeout(poll,2000);, но это не делает запрос ajax каждые 2 секунды.

Ответы [ 4 ]

4 голосов
/ 24 января 2012

Удалите () внутри setTimeout или setInterval. Обрабатывайте имя функции как переменную, и это то, что вы передаете.

3 голосов
/ 24 января 2012

"Я пытаюсь заставить setTimeout вызывать функцию poll каждые 2 секунды, это не так"

.setTimeout() метод вызываетфункция, которую вы передаете ей ровно один раз, после указанной задержки.

.setInterval() метод вызывает функцию, которую вы передаете ей несколько раз, с указанной задержкой между каждым вызовом.

От обновления к вашему вопросу вы, кажется, думаете, что они оба делают то же самое.Пожалуйста, прочитайте документацию, с которой я связан.

Обратите внимание, что вы должны передать ссылку на функцию (или строку для eval'd), так сказать:

setInterval(poll, 2000);
// NOT
setInterval(poll(), 2000);

Последнийне должен работать, потому что он немедленно вызывает poll() и передает возвращаемое значение (undefined) в setInterval(), поэтому я действительно не могу понять, почему это сработало для вас.

1 голос
/ 24 января 2012

Поскольку параметр setTimeout равен eval'd, вам следует попробовать это:

setTimeout("poll()",2000);

Или, если вы хотите работать с анонимными функциями лучше, чем со строками, которые получают eval'd:

setTimeout(function() {
  poll();
},2000);

Мне лично больше нравится последний.

0 голосов
/ 24 января 2012

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

setTimeout(poll, 2000);
//-----------^^^
// No parentheses...

Аналогично, в вызове $.ajax() функция success должна быть указателем функции, а не строкой:

$.ajax({
        //url: "http://192.168.0.11/"+Math.random(),
        url:"line-ajax.htm",
        contentType:"text/html",
        // Function pointer to doNothing
        success: doNothing
  });
...