我的目标是异步进行循环:
client.js
:
abc = function() {
for (var i = 0; i <= 49; i++) {
console.log(i);
Meteor.call('testBla', i)
}
}
server.js
testBla: function(i) {
function asyncCall() {
console.log('inside asyncCall', i)
return 'done';
}
var syncCall = Meteor.wrapAsync(asyncCall);
console.log('a');
var res = syncCall(i);
console.log('b')
return res;
}
控制台:
a
inside asyncCall 0
为什么会卡住?
答案 0 :(得分:0)
您可以传递给Meteor.wrapAsync
的函数必须具有特定的签名:它们的参数必须以给定2个参数的回调结束:错误和结果。
在异步函数体内,必须在函数失败时调用带有错误的回调,或者如果一切正常则调用结果。
function asyncHelloWorld(callsCount, callback){
// simulate fake error every 5 calls
if(callsCount % 5 === 0){
callback("error");
}
callback(null,);
}
for(var i = 0; i < 50; i++){
asyncHelloWorld(i, function(error, result){
if(error){
console.log(error.reason);
return;
}
console.log(result);
});
}
您只能包装尊重此签名和行为的函数,这是从Node.JS继承的标准。
当你包装异步函数时,如果你想处理潜在的错误,不要忘记使用try / catch块。
Meteor.methods({
helloWorld: function(i){
var syncHelloWorld = Meteor.wrapAsync(asyncHelloWorld);
console.log("a");
try{
var res = syncHelloWorld(i);
console.log("b")
return res;
}
catch(exception){
console.log(exception);
console.log("c");
// do not recover, propagates the exception back to the client (standard behavior)
throw exception;
}
}
});