异步调用生成" 错误:没有"光纤"也无法等待,即使有_wrapAsync



我在meteor中使用RSS解析器时遇到了问题。这是一个异步调用,所以它需要包装,但它似乎仍然不起作用。我认为这是因为匿名 on('readable' 函数在光纤之外,但我看不到如何解决它。

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

Meteor._wrapAsync()期望包装的函数返回错误和结果回调。 getBlog(),您的函数不会这样做,因此_wrapAsync不是正确的方法。

我之前已经包装了该函数,但使用了 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();                
    }
});

最新更新