Meteor: coincé en boucle asynchrone avec wrapAsync

Mon but est de parcourir une boucle de manière asynchrone:

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

console

a inside asyncCall 0

Pourquoi ça colle?

Les fonctions que vous pouvez transmettre à Meteor.wrapAsync doivent avoir une signature spécifique: leurs arguments doivent se terminer par un rappel avec 2 arguments: erreur et résultat.

Dans un corps de fonction asynchrone, vous devez appeler le rappel avec une erreur en cas d’échec de la fonction ou le résultat si tout se passe bien.

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

Vous ne pouvez envelopper que les fonctions qui respectent cette signature et ce comportement, qui est une norme héritée de Node.JS.

Lorsque vous encapsulez des fonctions asynchrones, n'oubliez pas d'utiliser un bloc try / catch si vous souhaitez gérer l'erreur potentielle.

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