Methods Meteor:使Meteor.method返回回调
流星是新来的,到目前为止我很喜欢它。我使用vzaar.com作为视频托管平台,他们有一个node.js包/API,我用meteorhacks:npm添加到我的Meteor项目中。API中的一切都很好,但是当我上传视频时,我需要在成功上传时从API中获取视频ID 问题: 我需要保存上传后从vzaar API返回的视频id,但由于这是在将来发生的,我的代码不会等待结果,只会给我“未定义”是否可以让Meteor.method等待响应? 以下是我目前的方法:Methods Meteor:使Meteor.method返回回调,methods,meteor,callback,Methods,Meteor,Callback,流星是新来的,到目前为止我很喜欢它。我使用vzaar.com作为视频托管平台,他们有一个node.js包/API,我用meteorhacks:npm添加到我的Meteor项目中。API中的一切都很好,但是当我上传视频时,我需要在成功上传时从API中获取视频ID 问题: 我需要保存上传后从vzaar API返回的视频id,但由于这是在将来发生的,我的代码不会等待结果,只会给我“未定义”是否可以让Meteor.method等待响应? 以下是我目前的方法: Meteor.methods({
Meteor.methods({
vzaar: function (videopath) {
api.uploadAndProcessVideo(videopath, function (statusCode, data) {
console.log("Video ID: " + data.id);
return data.id;
}, {
title: "my video",
profile: 3
});
console.log(videoid);
}
});
这就是Meteor.call现在的样子:
Meteor.call("vzaar", "/Uploads/" + fileInfo.name, function (err, message) {
console.log(message);
});
当我调用此方法时,我立即在浏览器控制台和meteor控制台中获得未定义的,几秒钟后,我在meteor控制台中获得视频ID。解决方案
经过几天的反复试验,我终于解决了这个问题。我学习了光纤(和),并进一步了解了Node.js的核心事件循环。问题是这个调用在将来会应答,所以我的代码总是返回undefined
,因为它在api应答之前运行
我首先尝试了Meteor.wrapAsync,我认为它会起作用,因为它实际上是未来的光纤。但我最终使用了未来的原始NPM模块。请参阅此工作代码:
var Future = Npm.require('fibers/future');
Meteor.methods({
vzaar: function (videopath) {
var fut = new Future();
api.uploadAndProcessVideo(videopath, function (statusCode, data) {
// Return video id
fut.return (data.id);
}, {
// Video options
title: "hello world",
profile: 3
});
// The delayed return
return fut.wait();
}
});
请记住首先正确安装npm模块
我通过以下途径了解了如何在这种情况下使用未来光纤
我希望这对其他人有用,因为它确实很容易实现。您可以在那里编写一个新函数,如果videoid
未定义,它将重新运行,并将其作为回调传递(仅当您以多种方式解析数据时才有助于回调)。你也可以调用你在里面的函数。您也可以尝试轮询,设置间隔以每n毫秒检查一次,然后在设置videoid
时清除间隔。我发现了一些有趣的东西,Meteor.wrapAsync。这里有一篇关于它的文章,但我不知道如何在我的代码中实现它。