Node.js meteor应用程序中的异步回调

Node.js meteor应用程序中的异步回调,node.js,twitter,meteor,Node.js,Twitter,Meteor,我正在使用ntwitter node.js模块从meteor应用程序内部访问twitter的流式API,但当尝试插入回调函数内的集合时,应用程序崩溃: twitter.stream('statuses/filter', {'track':'whatever'}, function(stream) { stream.on('data', function (data) { //logging the data coming back works fine console

我正在使用ntwitter node.js模块从meteor应用程序内部访问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线性执行模型的上下文中,有没有推荐使用异步回调的方法?我试着将插入物包裹在一根新的光纤内,这似乎有效,但我不确定它可能有什么影响

我发现这是有帮助的,但我仍然不确定哪种方法适合我的具体情况,所以任何帮助都将不胜感激


干杯

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

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); 
  }); 
});
之后,回到光纤内的正常Meteor执行环境中,无论是在计时器中还是在函数结果中,我们都会耗尽tweets数组,然后进行插入。Javascript数组并不关心它是否在光纤中运行


在我们的例子中,我们使用异步IMAP电子邮件而不是推特来实现这一点,但类比仍然成立。

将您的回调封装在
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); 
  }));
});
根据,当您使用第三方api/npm模块(看起来是这样)管理回调时,您希望使用
Meteor.bindEnvironment


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

虽然这可以工作,但在我的情况下,这在某种程度上否定了拥有实时流数据的意义,因为我正在使用流式api,而不必首先进行轮询。轮询在哪里?这与您以前的回调相同。轮询不在twitter流上,而是在内存缓冲区中,这只是一个快速查找,而不是对twitter的轮询。我不需要每隔一段时间轮询数组吗?如果可能的话,我宁愿实时更新收藏。