setInterval () работает только один раз - PullRequest
7 голосов
/ 04 января 2012

Я хочу периодически запрашивать PHP-скрипт для новых сообщений. Для этого я использую функцию setInterval () и AJAX.

$(document).ready(function(){

    var queryInterval = 1000; /* How fast we query for new messages */

    setInterval(getMessages(), queryInterval);

    function getMessages() {
        console.log("tick");
    }

});

Однако, когда я смотрю на консоль Javascript, я вижу только «галочку» один раз. Я позаботился о том, чтобы консоль не игнорировала больше логов с одинаковыми строками, поэтому, если код работал правильно, он должен показывать «тик» в консоли каждую секунду.

Кто-нибудь знает, что здесь может пойти не так?

Ответы [ 6 ]

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

Изменение:

setInterval(getMessages(), queryInterval);

Кому:

setInterval(getMessages, queryInterval);
9 голосов
/ 04 января 2012

На самом деле, setInterval вообще не работает getMessages (ни разу).setInterval ожидает ссылку на функцию, но вы выполняете getMessages функцию немедленно и передаете ее возвращаемое значение setInterval (что составляет undefined).Вот что делают парни после getMessage.

Передайте ссылку на setInterval следующим образом:

setInterval(getMessages, queryInterval);

Если это единственное место, где используется getMessages, тогдаможно также написать так:

setInterval(function() {
    console.log("tick");
}, queryInterval);
2 голосов
/ 04 января 2012

Этот вызывает getMessages, а не планирует его. Убрать скобки.

setInterval(getMessages(), queryInterval);

setInterval(getMessages, queryInterval);
2 голосов
/ 04 января 2012

Удалить () после getMessage

0 голосов
/ 28 апреля 2018

Проверьте строку кода:

setInterval(getMessages(), queryInterval);

Функция setInterval требует, чтобы вы передали ссылку на функцию обратного вызова.

Когда вы передаете getMessages(), Вы фактически вызываете функцию и передаете ее возвращаемый объект в функцию setInterval.

Так что просто измените свою строку на:

setInterval(getMessages, queryInterval);

и все будет работать отлично!

0 голосов
/ 28 апреля 2018

Хотя другие уже рассмотрели эту тему выше, и window.setTimeout (), и window.setInterval () требуют, чтобы функция ссылалась на . Вместо этого ваш код предоставляет возвращаемое значение из вызова функции .

Когда вы хотите вызвать или вызвать функцию JavaScript, вы пишете, как и ожидалось:

DoMyfunction ();

Движок JavaScript выполнит эту функцию при обнаружении этой строки.

Однако, что требуют setTimeout () и setInterval (), это ссылка на функциональный объект , соответствующий вашей функции. Которые вы получаете с помощью следующих и аналогичных средств:

myFunc = DoMyFunction;

Эта строка копирует ссылку на функциональный объект , соответствующий DoMyFunction (), в новую переменную. Который вы можете затем передать setInterval () и setTimeout (), а именно:

discard = window.setTimeout (myFunc, 1000);

Эта строка выше будет указывать движку JavaScript на выполнение заданной функции (а именно DoMyFunction ()) один раз по истечении 1 секунды и:

discard = window.setInterval (myFunc, 1000);

заставит механизм JavaScript выполнять заданную функцию несколько раз, каждую секунду.

Конечно, вы можете достичь того же эффекта без использования новой переменной, просто так:

discard = window.setTimeout (DoMyFunction, 1000);

и т.д.

Если, однако, вы допустили ошибку при использовании:

discard = window.setTimeout (DoMyFunction (), 1000);

вместо этого происходит то, что DoMyFunction () выполняется, и любой возвращаемый параметр, возникающий из этого, равен , затем передается в функцию window.setTimeout (). Так как window.setTimeout () ожидает, что здесь будет передана ссылка на объект функции, и вместо этого получит все, что возвращает ваша функция (или undefined , если ваша функция ничего не возвращает), тогда внутренняя проверка выполняется setTimeout () ( и setInterval ()) покажет, что он не получил здесь ссылку на объект функции, и просто молча прервет работу.

Конечно, гораздо более коварная ошибка может возникнуть, если DoMyFunction () на самом деле действительно возвращает действительный объект функции! Если вы написали DoMyFunction () для этого, тогда этот функциональный объект будет вместо этого передан setTimeout (), а будет запущена функция ! Конечно, вы можете использовать это намеренно и написать свою DoMyFunction () как замыкание, возвращая фактическую функцию, которую вы хотите, чтобы setTimeout () выполняла как возвращаемый параметр объекта функции, и если вы используете что подход, то форма:

discard = window.setTimeout (DoMyFunction (), 1000);

больше не будет ошибочным.

Помните, что каждая функция JavaScript, которую вы пишете в своем коде, когда этот код анализируется, связана с функциональным объектом механизмом JavaScript. Для выполнения функции используйте:

DoMyFunction ();

Для ссылки на функциональный объект вместо этого используйте:

DoMyFunction;

Те () могут сделать огромную разницу в зависимости от контекста, в результате JavaScript использует этот подход для различия между ссылкой на объект функции и функцией инструкция по исполнению .

...