4

我正在使用 ntwitter node.js 模块从流星应用程序内部访问 twitter 的流 API,但是当尝试插入回调函数内的集合时,应用程序崩溃:

twitter.stream('statuses/filter', {'track':'whatever'}, function(stream) {
  stream.on('data', function (data) {
      //logging the data coming back works fine
      console.log(data);
      //the next line throws "Error: Meteor code must always run within a Fiber"
      Tweets.insert(data); 
  });
});

是否有推荐的方法在 Meteors 线性执行模型的上下文中使用异步回调?我尝试将插入物包裹在似乎可行的新光纤中,但我不确定它可能产生的任何影响。

我发现这个http://gist.io/3443021很有帮助,但我仍然不确定哪种方法适合我的特殊情况,因此我们将不胜感激。

干杯

4

2 回答 2

0

我们使用了不同的设计模式。在异步回调中,我们更像是一个设备驱动程序,只是将结果缓存在内存中:

var tweets = [];

twitter.stream('statuses/filter', {'track':'whatever'}, function(stream) {
  stream.on('data', function (data) {
      //logging the data coming back works fine
      console.log(data);
      //the next line throws "Error: Meteor code must always run within a Fiber"
      tweets.push(data); 
  }); 
});

然后稍后,回到 Fiber 内的正常 Meteor 执行环境中,无论是在计时器中还是在函数的结果中,我们都会排空 tweets 数组并执行插入操作。Javascript 数组不关心它是否在 Fiber 中运行。

在我们的例子中,我们使用异步 IMAP 电子邮件而不是推文来执行此操作,但类比仍然成立。

于 2013-01-12T14:53:27.463 回答
0

像这样包装你的回调Meteor.bindEnvironment

twitter.stream('statuses/filter', {'track':'whatever'}, function(stream) {
  stream.on('data', Meteor.bindEnvironment(function (data) {
      //logging the data coming back works fine
      console.log(data);
      //the next line throws "Error: Meteor code must always run within a Fiber"
      Tweets.insert(data); 
  }));
});

根据this SO post about Async wrappers on the Meteor Server,您希望在使用Meteor.bindEnvironment第三方api/npm 模块管理回调时使用(看起来就是这种情况)

Meteor.bindEnvironment创建一个新的 Fiber 并将当前 Fiber 的变量和环境复制到新的 Fiber 中。

于 2015-01-23T20:49:08.003 回答