2013-01-12 197 views
4

我使用Node.js的ntwitter模块访问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这是有益的,但我仍然不确定哪种方法适合我的特殊情况,所以任何帮助将不胜感激。

干杯

回答

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

再后来上,内的光纤内的正常流星执行环境背面,无论是在一个计时器或一个结果的函数,我们将tweets数组排除,然后执行插入操作。 Javascript数组并不关心它是否在光纤内运行。

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

+0

虽然这将工作,在我的情况下,它会有点否定具有实时流数据的点,因为我使用流api而不必轮询第一个地方 – jul

+1

轮询在哪里?这与之前的回调相同。轮询不在Twitter流上,它位于内存缓冲区中,这不过是快速查询,而不是Twitter的投票。 –

+0

好吧,我不需要以某种间隔轮询数组吗?如果可能,我宁愿实时更新集合。 – jul

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创建一个新光纤并将当前光纤的变量和环境复制到新光纤。