流星:使 Meteor.method return 回调

Meteor: Make Meteor.method return a callback

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

问题:

我需要保存上传后从 vzaar API 返回的视频 ID,但由于它发生在未来,我的代码不等待结果,只给我 "undefined"。 是否可以让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(here and here),进一步了解了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();

    }

});

记得先meteorhacks:npm正确安装npm模块。

我通过 this Whosebug answer.

了解了如何在这种情况下使用 Future 光纤

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