我在我的Meteor异步方法中设置了一个回调函数,可以调用"可读"事件。但是当开启时没有调用回调。"可读"被解雇了(我知道它是从我设置的console.log中被解雇的。)
我在这里遗漏了什么吗?我现在已经尝试了几个不同的东西几个小时了!
Meteor.startup(() => {
Meteor.call("getfeed", function(feedloader) {
//I get: TypeError: undefined is not a function]
console.log(feedloader);
});
});
Meteor.methods({
getfeed: function(callb) {
var req = request('http://feeds.feedburner.com/Techcrunch');
var feedparser = new FeedParser();
testing = [];
//........a bunch of functions........
feedparser.on('readable', function() {
var stream = this
, meta = this.meta
, item;
while (item = stream.read())
{
//I'm pushing the results into testing var
testing.push(item);
}
//From the logs I can see that this is called 12 times
//but the callback's not firing!!!
console.log(testing.length);
callb(testing);
});
}
});
答案 0 :(得分:1)
Meteor方法不是异步函数,即使您在“调用”方法时传递它,它们也不会获得回调参数。相反,每个方法都在Fiber
内执行,这是处理异步代码的另一种方式。
幸运的是,Meteor有一个很好的帮手,可以让你混合两种风格。您需要做的是用Meteor.wrapAsync
包装方法代码的“纯”异步部分。这个结构应该或多或少看起来像这样:
Meteor.methods({
getfeed: function() {
var wrapped = Meteor.wrapAsync(function (callb) {
var feedparser = new FeedParser();
testing = [];
// ...
feedparser.on('readable', function() {
// probably the same code you have, but without "callb()"
});
feedparser.on('end', function () {
// NOTE: No error here, so the first argument must be null.
callb(null, testing);
})
});
// NOTE: Finally, call the wrapped function
return wrapped();
}
});