输入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('纤维/未来');
}); }
答案 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很棒,请使用它!