我的客户正在拨打服务器。
Meteor.call('someRequest', params, onAllDoneCallback);
由(服务器代码)
处理Meteor.methods({
'someRequest': function(params, cb) {
anAsyncFunction(params, cb);
return true;
},
});
我希望在onAllDoneCallback
完成后在客户端触发anAsyncFunction
并触发自己的回调。
然而,在Meteor中,someRequest
的第二个参数似乎被忽略,并且onAllDoneCallback
被someRequest
返回的触发,这里是true
,其中在anAsyncFunction
完成之前调用。
在我的情况下,我更关心时间问题(我用它来告诉客户端处理已经完成,而不仅仅是请求得到了好评)但是其他人可能会想要使用来自anAsyncFunction
答案 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){}