Meteor:使Meteor.method返回回调



Meteor的新手,到目前为止我很喜欢它。我使用vzaar.com作为视频托管平台,他们有一个node.js包/API,我用meteohacks:npm将其添加到我的Meteor项目中。API中的一切都很好,但当我上传视频时,我需要在成功上传时从API获取视频ID。

问题:

上传后,我需要保存从vzaar API返回的视频id,但由于将来会发生这种情况,我的代码不会等待结果,只会给我"未定义"是否可以让Meteor.method等待响应

到目前为止,我的方法是:

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);
});

当我调用这个方法时,我会立即在浏览器控制台和流星控制台中获取undefined,几秒钟后,我会在流星控制台中获得视频ID。

解决方案

经过几天的反复试验,我终于解决了这个问题。我了解了Fibers(这里和这里),并了解了更多关于Node.js的核心事件循环的信息。问题是这个调用将来会应答,所以我的代码总是返回undefined,因为它在api应答之前运行。

我第一次尝试了Meteor.wrapAsync,我认为它会起作用,因为它实际上是Future光纤。但我最终使用了Future的原始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();
    }
});

请记住使用metrohacks正确安装npm模块:首先安装npm。

我通过这个stackoverflow的回答了解了如何在这种情况下使用Future光纤。

我希望这对其他人有用,因为它确实很容易实现。

最新更新