同步Meteor.methods函数内的MeteorJS异步代码

时间:2012-11-02 06:20:48

标签: javascript meteor

如何让客户端method.call等待异步函数完成?目前它到达函数的末尾并返回undefined。

Client.js

Meteor.call( 'openSession', sid, function( err, res ) {
    // Return undefined undefined
    console.log( err, res ); 
});

Server.js

Meteor.methods({
    openSession: function( session_id ) {
        util.post('OpenSession', {session: session_id, reset: false }, function( err, res ){
            // return value here with callback?
            session_key = res;
        });
     }
});

3 个答案:

答案 0 :(得分:6)

我能够在this gist中找到答案。为了在method.call中运行异步代码,你可以使用Futures来强制你的函数等待。

    var fut = new Future();
    asyncfunc( data, function( err, res ){
        fut.ret( res );
    });
    return fut.wait();

答案 1 :(得分:6)

Meteor的最新版本提供了未记录的Meteor._wrapAsync函数,该函数将带有标准(err, res)回调的函数转换为同步函数,这意味着当前光纤会在回调返回之前产生,然后使用Meteor .bindEnvironment确保保留当前的Meteor环境变量(例如Meteor.userId())

一个简单的用法如下:

asyncFunc = function(arg1, arg2, callback) {
  // callback has the form function (err, res) {}

};

Meteor.methods({
  "callFunc": function() {
     syncFunc = Meteor._wrapAsync(asyncFunc);

     res = syncFunc("foo", "bar"); // Errors will be thrown     
  }
});

您可能还需要使用function#bind来确保在包装之前使用正确的上下文调用asyncFunc。 有关详细信息,请参阅:https://www.eventedmind.com/tracks/feed-archive/meteor-meteor-wrapasync

答案 2 :(得分:0)

更新:对不起,我应该更仔细地阅读这个问题。看起来这个问题也被问到并回答here

除了期货之外,另一种需要考虑的模式可能是使用从异步调用返回的数据更新另一个模型,然后订阅该模型的更改。


meteor.call documentation来看,回调函数的结果参数(err, res)应该包含openSession函数的输出。但是您没有从openSession函数返回任何值,因此返回值未定义。

您可以测试一下:

客户端:

Meteor.call('foo', function(err, res) {
  console.log(res); // undefined
});

Meteor.call('bar', function(err, res) {
  console.log(res); // 'bar'
});

服务器:

Meteor.methods({
  foo: function() {
    var foo = 'foo';
  },
  bar: function() {
    var bar = 'bar';
    return bar;
  }
});