我正在使用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很有帮助,但我仍然不确定哪种方法适合我的具体情况,所以任何帮助都会受到赞赏。
干杯
答案 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
创建一个新光纤并将当前光纤的变量和环境复制到新光纤。