2015-05-24 2 views
3

Когда я выполняю следующее, incidentController вызывается после 10 секунд и продолжает выполняться без проблем через каждые 10 секунд:setInterval, похоже, не нравится() в функции, которую он вызывает. Зачем?

// This works fine in nodejs v0.11.13 
setInterval(incidentController, 10 * 1000); 

function incidentController() { 
console.log ('executed'); 
} 

Однако это выполняет сразу и выдает следующее сообщение об ошибке на второй итерации:

//This doesn't. The parens which wrap (123) cause the error. 

setInterval(incidentController(123), 10 * 1000); 

function incidentController (someInt) { 
console.log ('executed: ', someInt); 
} 

Ошибка:

timers.js:287 
    callback.apply(this, args); 
      ^
TypeError: Cannot read property 'apply' of undefined 
    at wrapper [as _onTimeout] (timers.js:287:13) 
    at Timer.listOnTimeout (timers.js:133:15) 

Кажется incidentController есть/становится undefined как-то. Может кто-нибудь объяснить, почему это ожидаемое поведение (я предполагаю, что это так или иначе)?

Я могу обойти это довольно легко, но мне просто интересно, почему он ведет себя таким образом - делает передачу значений параметров немного менее удобной, так как я не могу сделать это внутри самого оператора setInterval.

+1

потому, что вы выполняете функцию! :) У него нет подсказки, вы хотите назначить ссылку на него. – epascarello

+1

[Параметры передачи в функции setInterval] (http://stackoverflow.com/questions/457826/pass-parameters-in-setinterval-function)/[Как передать параметр в callbackTimeout()?] (Http: //переполнение стека.com/questions/1190642/how-can-i-pass-a-parameter-to-a-setimeout-callback) –

ответ

7

setInterval принимает объект функции как первый параметр. Но, когда вы делаете

setInterval(incidentController(123), 10 * 1000); 

вы передаете результат вызова incidentController, который undefined (В JavaScript, если функция не возвращает ничего явно, то по умолчанию undefined будут возвращены). Вот почему вы получаете ошибку

Cannot read property 'apply' of undefined 

Он пытается вызвать функцию apply на undefined.


makes passing in parameter values a bit less convenient since I can't do it inside the setInterval statement itself

Нет, сэр. Вы можете удобно передать параметр в функцию обратного вызова в setInterval себя, как этот

setInterval(incidentController, 10 * 1000, 123); 

Теперь, когда incidentController вызывается, через каждые 10 секунд, 123 будет передан в качестве первого параметра к нему.

+1

не знал, что синтаксис setInterval (инцидентController, 10 * 1000, 123) ;. Документировано? –

+2

@maboiteaspam Yup, зарегистрированный в [MDN docs] (https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setInterval#Syntax), а также в [Node.js docs] (https://nodejs.org/api/timers.html#timers_setinterval_callback_delay_arg) – thefourtheye

+0

Ого, не знал об этом, это круто. Наверное, это недавняя функция? Внизу сказано IE10 + для поддержки параметров обратного вызова. –

1

Неправильно использовать setInterval как

setInterval(incidentController(123), 10 * 1000); 

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

Если вы хотите передать параметр для обратного вызова, вы должны обернуть вызов функции с анонимной функции как

setInterval(function(){incidentController(123)}, 10 * 1000); 

См Pass parameters in setInterval function

Смежные вопросы