Meteor:让Meteor.method返回一个回调

时间:2015-04-06 13:11:36

标签: methods meteor callback

Meteor的新手,我到目前为止都喜欢它。我使用vzaar.com作为视频托管平台,他们有一个node.js包/ API,我将其添加到meteorhacks的meteor项目中:npm。 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。

1 个答案:

答案 0 :(得分:2)

解决方案

经过几天的反复试验,我终于解决了这个问题。我了解了Fibers(herehere),并了解了有关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 stackoverflow answer.

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

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