Meteor js回调无效

时间:2016-07-20 12:27:43

标签: javascript asynchronous meteor callback

我在我的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);

    });
  }
});

1 个答案:

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