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);
},
});