使用wrapAsync

时间:2015-05-25 17:06:59

标签: loops asynchronous meteor server

我的目标是异步进行循环:

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

为什么会卡住?

1 个答案:

答案 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;
    }
  }
});