如何在执行异步调用的meteor方法上执行回调?

时间:2016-01-26 19:30:36

标签: asynchronous meteor methods callback

我的客户正在拨打服务器。

Meteor.call('someRequest', params, onAllDoneCallback);

由(服务器代码)

处理
Meteor.methods({
    'someRequest': function(params, cb) {
        anAsyncFunction(params, cb);
        return true;
    },
});

我希望在onAllDoneCallback完成后在客户端触发anAsyncFunction并触发自己的回调。

然而,在Meteor中,someRequest的第二个参数似乎被忽略,并且onAllDoneCallbacksomeRequest返回的触发,这里是true,其中在anAsyncFunction完成之前调用。

在我的情况下,我更关心时间问题(我用它来告诉客户端处理已经完成,而不仅仅是请求得到了好评)但是其他人可能会想要使用来自anAsyncFunction

的参数调用回调

2 个答案:

答案 0 :(得分:3)

您现在正在做的是将一个函数传递给服务器。如果 工作,那就非常不安全了。您要做的是创建未来,然后使用它来管理异步功能。这是一个例子:

let Future = Npm.require('fibers/future');
Meteor.methods({
  someRequest: function (someArg) {
    // for security reasons, make sure you check the type of arguments.
    check(someArg, String);

    // future is an async handler.
    let future = new Future();
    // this is a function for a generic node style callback [ie, function (err, res)]
    let resolver = future.resolver();

    // run your function and pass it the future resolver
    // the future will be resolved when the callback happens.
    anAsyncFunction(someArg, resolver);

    // this meteor method will not end until future has been resolved.
    return future.wait();
  }
});

或者,Meteor提供了一个wrapAsync,它提供了在期货中包装异步函数的类似功能,因此它们可以在流星方法中运行。那就是:

let wrappedAsyncFunction = Meteor.wrapAsync(anAsyncFunction /** second argument is `this` binding*/);
return wrappedAsyncFunction();

答案 1 :(得分:0)

调整此答案:Meteor: Proper use of Meteor.wrapAsync on server

你必须使用Meteor的{​​{1}} api,它接受​​一个接受回调作为其最后一个参数的函数,回调类似于wrapAsync。所以它看起来像:

function(error, result){}