Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我的Meteor.method返回未定义?_Meteor - Fatal编程技术网

为什么我的Meteor.method返回未定义?

为什么我的Meteor.method返回未定义?,meteor,Meteor,有一个简单的字段可以输入youtube ID。我正在使用renaldo的youtube api()检索youtube剪辑的标题 客户端事件成功地将曲目ID(var tid)值传递给方法“addTrack”-它将曲目标题输出到服务器上的控制台。我真的很难把任何东西都退回给客户 如果我从'addTrack'方法调用'getVideoData'方法,它每次仍然返回'undefined'。我不是meteor或javascript方面的专家,这只是我正在学习的东西 我理解回调的概念和javascript的

有一个简单的字段可以输入youtube ID。我正在使用renaldo的youtube api()检索youtube剪辑的标题

客户端事件成功地将曲目ID(var tid)值传递给方法“addTrack”-它将曲目标题输出到服务器上的控制台。我真的很难把任何东西都退回给客户

如果我从'addTrack'方法调用'getVideoData'方法,它每次仍然返回'undefined'。我不是meteor或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(函数(){ 未来=新产品需求(“纤维/未来”)

}));
}

Meteor方法很棘手,因为它们通常是同步的(开发人员认为它们是同步的)。因此,您需要使用将所有内容包装到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处理方法中的异步需求


最后,这是伟大的,使用它

这是一个非常常见的流星问题,有几种可能的解决方案。基本问题是您的方法正在调用异步函数。您如何从其他方法调用方法“getVideoData”,您是否使用Meteor.call(“getVideoData”)?是的,我正在通过Meteor.call(“getVideoData”)从另一个方法调用该方法,上面的工作代码是在Meteor 1.3中实现异步回调的最佳方法吗?