为什么我的Meteor.method返回undefined?

时间:2016-04-04 01:13:11

标签: meteor

输入youtube ID有一个简单的字段。我正在使用renaldo的youtube api(https://atmospherejs.com/renaldo/youtube-api)来检索youtube剪辑的标题。

客户端事件将跟踪ID(var tid)值传递给方法' addTrack'成功 - 它将轨道标题输出到服务器上的控制台。我真的很难将任何东西归还给客户。

如果我打电话给' getVideoData'来自' addTrack'的方法方法,它仍然返回' undefined'每次。我不是流星或javascript的专家,这只是我正在学习的东西。

我理解回调的概念和javascript的同步性(我认为!)。

感谢。

[编辑下面的代码解决了我的问题,使用Future]

if (Meteor.isServer) {

  YoutubeApi.authenticate({
    type: 'key',
    key: API_KEY
  });

Meteor.methods({
  addTrack: function(tid) {

  Meteor.call("getVideoData", tid, function(err,res) {

    console.log(res);

    });
  },
  getVideoData: function(tid) {
    var future = new Future();

    YoutubeApi.videos.list({
    part: "snippet",
    id: tid,
  }, function (err,data) {
      var _data = {"title":data.items[0].snippet.title,"desc":data.items[0].snippet.description};
      future["return"](_data)

    });
    return future.wait();

}

Meteor.startup(function(){     未来= Npm.require('纤维/未来');

}); }

1 个答案:

答案 0 :(得分:2)

流星方法很棘手,因为它们使用Fibers来实现同步(好吧,它们在开发人员看来是同步的)。因此,您需要使用Meteor.wrapAsync()将所有内容包装到YoutubeApi。我没有测试过以下代码,但它应该类似于:

Meteor.methods({
  getVideoData: function(tid) {
    var syncYT = Meteor.wrapAsync(YoutubeApi.videos.list);
    var data = syncYT({part: "snippet",id: tid,});
    var transformed = {"title":data.items[0].snippet.title,"desc":data.items[0].snippet.description};

    console.log(transformed.title);
    return transformed.title;
  }
});

在这种情况下,您需要阅读有关错误处理的更多信息,但这应该可以帮到您。请记住,客户端Meteor始终是异步的,服务器端可选地是异步的。使用wrapAsync或Futures来处理方法中的异步需求。

最后,Meteor guide很棒,请使用它!