2015-04-15 3 views
0

Я пытаюсь использовать функцию Meteor.setInterval, но у меня есть некоторые проблемы с ее использованием.Почему вызов метода с использованием Meteor.setInterval вызывает исключение TypeError?

Вот мой код:

Meteor.methods({ 
    init : function(){ 
    console.log('test'); 
    }, 
    start : function(period){ 
    console.log('start : period '+period); 

    Meteor.setInterval(Meteor.call('init'),period); 
    } 
}); 

Meteor.call('start', 100); 

Я вижу "тест" в моей консоли 1 раз, то я получаю следующее сообщение об ошибке:

Exception в setInterval обратного вызова: TypeError: не определено не функция.

Я смотрел на этот вопрос: Exception in setInterval callback но я сделал это по-другому (используя Method.methods).

Что происходит и как я могу это исправить?

ответ

2

Посмотрите на этой линии:

Meteor.setInterval(Meteor.call('init'),period); 

Теперь старайтесь думать о том, что делает двигатель. Сначала Meteor.setInterval. Что ему нужно для этой функции:

  • обратного вызова
  • Число миллисекунд

Что вы проходите? Количество миллисекунд, а для обратного вызова вы передаете Meteor.call('init'). Двигатель видит ваш call и выполняет его, потому что это то, что вы просите его сделать с круглой скобкой. И ваш звонок ничего не возвращает. И тогда setInterval пытается ничего не выполнить.

Итак, как вы можете передать функцию с параметрами до Meteor.setInterval? Один из способов, чтобы обернуть его внутри закрытия:

Meteor.setInterval(function() { 
    Meteor.call('init'); 
}, period }); 

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

Вы также можете частично применить call. Существует два способа:

  1. Native:

    Meteor.setInterval(Meteor.call.bind(null, 'init'), period); 
    
  2. С _.partial:

    Meteor.setInterval(_.partial(Meteor.call, 'init'), period); 
    
+0

Спасибо вам большое за хорошую объяснений, он теперь работает :) – TLR

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

  • Нет связанных вопросов^_^