流星应用程序中的异步回调

时间:2013-01-12 04:36:51

标签: node.js twitter meteor

我正在使用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线性执行模型的上下文中使用异步回调?我尝试将插入包装在新的Fiber中,这似乎有效,但我不确定它可能有任何影响。

我发现这个http://gist.io/3443021很有帮助,但我仍然不确定哪种方法适合我的具体情况,所以任何帮助都会受到赞赏。

干杯

2 个答案:

答案 0 :(得分: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); 
  }); 
});

然后再回到光纤内的正常Meteor执行环境中,无论是在计时器还是函数的结果中,我们都会耗尽tweets数组并进行插入。 Javascript数组不关心它是否在光纤内运行。

在我们的案例中,我们使用asynch IMAP电子邮件而不是推文进行此操作,但这种类比仍然有效。

答案 1 :(得分: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,当您使用第三方api / npm模块(看起来是这样)管理回调时,您希望使用Meteor.bindEnvironment

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