setInterval() запускает функцию только один раз

Я хочу периодически запрашивать 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, я вижу «галочку» только один раз. Я убедился, что консоль больше не игнорирует журналы тех же строк, поэтому, если код работает правильно, он должен показывать «галочку» в консоли каждую секунду.

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


person James Dawson    schedule 04.01.2012    source источник
comment
был еще один вопрос точно так же, как это, как час назад.   -  person J. Holmes    schedule 04.01.2012
comment
getMessages() должно быть getMessages   -  person georg    schedule 04.01.2012
comment
@32bitkid: Вопросы о setTimout и setInterval довольно распространены.   -  person Ivan    schedule 04.01.2012


Ответы (6)


Изменять:

setInterval(getMessages(), queryInterval);

To:

setInterval(getMessages, queryInterval);
person qwertymk    schedule 04.01.2012
comment
@qwertymk, но я хочу передать аргумент этой функции, что мне делать this.intervall = setInterval(window.External(this),intervally); Пожалуйста помоги - person Jamil Hneini; 12.09.2013
comment
@JamilHneini, так и делай: setInterval(function() { getMessages(arg) } , queryInterval); - person qwertymk; 15.09.2013
comment
@qwertymk Я работаю с функцией, которая является конструктором объекта. У меня есть функция, которая берет этот объект и делает что-то, что мне нужно для запуска этой функции в интервале, как если бы я использовал function () {getMessages (this), 1900); это считается окном, а не конструктором объекта - person Jamil Hneini; 15.09.2013
comment
@JamilHneini Попробуйте открыть новый вопрос - person qwertymk; 15.09.2013
comment
@qwertymk Готово, вот ссылка stackoverflow.com/questions/18819677/ - person Jamil Hneini; 16.09.2013

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

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

setInterval(getMessages, queryInterval);

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

setInterval(function() {
    console.log("tick");
}, queryInterval);
person Wayne    schedule 04.01.2012
comment
@qwertymk, безусловно, прав, но +1 за это, потому что он более четко объясняет, как setInterval работает под капотом. - person jsh; 19.12.2012
comment
@jsh - Верно, что мне не нравится в ответах, подобных тому, который был принят, так это то, что, хотя он и правильный, он мало чему учит. Понимание разницы между обращением к функции и ее выполнением является очень, очень базовой, фундаментальной частью языка. - person Wayne; 19.12.2012

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

person nav    schedule 04.01.2012

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

setInterval(getMessages(), queryInterval);

setInterval(getMessages, queryInterval);
person Tim Medora    schedule 04.01.2012

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

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

ВыполнитьМоюфункцию();

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

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

мояФункция = ВыполнениеМоейФункции;

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

отбросить = window.setTimeout (myFunc, 1000);

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

отбросить = 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;

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

person David Edwards    schedule 28.04.2018

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

setInterval(getMessages(), queryInterval);

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

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

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

setInterval(getMessages, queryInterval);

и он будет работать нормально!

person Daniel Mendes    schedule 28.04.2018