我在流星中使用RSS解析器时遇到了问题。这是一个异步调用,所以它需要被包装,但它似乎仍然不起作用。我认为这是因为匿名开启('可读'功能在光纤之外,但我看不出如何解决它。
var FeedParser = Meteor.require('feedparser');
var request = Meteor.require('request');
function getBlog(url, parameter, id){
request(parameter)
.on('error', function (error) {
console.error(error);
})
.pipe(new FeedParser())
.on('error', function (error) {
console.error(error);
})
.on('readable', function () {
var stream = this,
item;
while (item = stream.read()) {
Items.insert(new_item);
}
});
}
var wrappedGetBlog = Meteor._wrapAsync(getBlog);
Meteor.methods({
blog: function (url, parameter, id) {
console.log('parsing blog');
var items = wrappedGetBlog(url, parameter, id);
}
});
答案 0 :(得分:2)
Meteor._wrapAsync()
期望包装函数返回错误并导致回调。你的函数getBlog()
没有这样做,所以_wrapAsync不是正确的方法。
之前我已经包裹了that function但是使用了Future。
这种方法允许我从Meteor.method()
调用feedparser,它不允许异步函数,但您也尝试在可读事件中执行insert
。我认为insert
会抱怨它不在光纤中。也许这样也是必要的:
var r = request( parameter );
r.on( 'response' , function(){
var fp = r.pipe( new FeedParser() ); //need feedparser object as variable to pass to bindEnvironment
fp.on('readable', Meteor.bindEnvironment(
function () {
var stream = this,
item;
while (item = stream.read()) {
Items.insert(new_item);
}
}
, function( error ){ console.log( error );}
, fp // variable applied as `this` inside call of first function
));
});
纤维是另一种选择......
var Fiber = Npm.require( "fibers" );
.on('readable', function () {
var stream = this,
item;
while (item = stream.read()) {
Fiber( function(){
Items.insert(new_item);
Fiber.yield();
}).run();
}
});