Asynchronous 如何对执行异步调用的meteor方法执行回调?

Asynchronous 如何对执行异步调用的meteor方法执行回调?,asynchronous,meteor,methods,callback,Asynchronous,Meteor,Methods,Callback,我的客户正在给服务器打电话 Meteor.call('someRequest', params, onAllDoneCallback); 由(服务器代码)处理 我希望在anAsyncFunction完成并触发自己的回调后,在客户端触发onaldonecallback 然而,在Meteor中,someRequest的第二个参数似乎被忽略,onaldonecallback被someRequest返回的内容触发,这里是true,在anAsyncFunction完成之前调用 在我的例子中,我更关心的是

我的客户正在给服务器打电话

Meteor.call('someRequest', params, onAllDoneCallback);
由(服务器代码)处理

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

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


在我的例子中,我更关心的是时间问题(我使用它来告诉客户机处理已经完成,不仅请求已收到),而且其他人可能希望调用回调,参数来自
anAsyncFunction

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

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
,它提供了类似的功能,可以在futures中包装异步函数,以便它们可以在Meteor方法中运行。即:

let wrappedAsyncFunction = Meteor.wrapAsync(anAsyncFunction /** second argument is `this` binding*/);
return wrappedAsyncFunction();
调整这一答案:

您必须使用Meteor的
wrapAsync
,它将接受回调的函数作为最后一个参数,回调类似于
function(error,result){}
。所以它看起来像:

Meteor.methods({
    'someRequest': function(params){
        var wrap = Meteor.wrapAsync(anAsyncFunction);
        return wrap(params);
    },
});

你应该在回调中返回结果,而不是返回True。我刚刚发现了它!你对
未来
wrapAsync
有什么看法?似乎建议将
wrapAsync
作为一个好的默认值如果您需要对执行的“流程”进行更精细的控制,了解未来的工作方式非常有益。例如,如果您使用的是
EventEmitter
,需要在解析后解除侦听器的绑定。在使用meteor的future wrappings时,这对我来说是一个救命稻草,很好地与您保持联系,这是我发现的使用futures实现异步方法的最佳示例!
Meteor.methods({
    'someRequest': function(params){
        var wrap = Meteor.wrapAsync(anAsyncFunction);
        return wrap(params);
    },
});