异步调用生成“错误:不能没有”光纤“,即使使用_wrapAsync也是如此

时间:2014-01-16 00:31:27

标签: meteor event-loop

我在流星中使用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);
    }
});

1 个答案:

答案 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();                
    }
});