为什么使用 Meteor.setInterval 调用方法会抛出 TypeError 异常?

Why does calling a method using Meteor.setInterval throw a TypeError exception?

我正在尝试使用 Meteor.setInterval 函数,但在使用时遇到了一些问题。

这是我的代码:

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);

我在控制台中看到 "test" 1 次,然后出现以下错误:

Exception in setInterval callback: TypeError : undefined is not a function.

我一直在看这个问题:Exception in setInterval callback 但我用不同的方式来做(使用 Method.methods)。

这是怎么回事,我该如何解决?

看看这一行:

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

现在试着想想引擎是做什么的。首先,Meteor.setInterval。这个功能他需要的是:

  • 回调
  • 毫秒数

你传递了什么?毫秒数,对于回调,您传递 Meteor.call('init')。引擎看到您的 call 并执行它,因为这就是您要求他用括号做的事情。而你的电话 returns 什么都没有。然后 setInterval 尝试不执行任何操作。

那么,如何将带参数的函数传递给 Meteor.setInterval?一种方法是将其包裹在闭包中:

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

这样,你的call不会立即执行,只有当setInterval使用回调时才会执行,然后执行你的call.

您也可以部分应用 call。有两种方式:

  1. 母语:

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

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