Meteor: utilisation des bibliothèques synchrones-wrapAsync et bindEnvironment

# # #Whats Meteor. wrapAsync et Meteor. bindEnvironment?

Dans la partie 1, nous avons vu comment Meteor a abstrait le code asynchrone en utilisant des fibres et fourni un moyen facile d'écrire JS dans un style synchrone. Dans la partie 2, nous comprenons comment travailler avec des bibliothèques asynchrones pures

En utilisant des fibres, nous pouvons modifier une fonction asynchrone, pour écrire un code synchrone comme. Cependant, que se passe-t-il lorsque nous ne pouvons pas modifier la fonction comme dans le cas des bibliothèques tierces?

Chez ShareThis, notre application Meteor utilise le S3 d'Amazon comme couche de cache et de stockage de données. D'après la documentation d'Amazon S3, la signature de la méthode JavaScript à ajouter à un seau S3 ressemble à

"'

getObject(params = {}, callback) ⇒ AWS.Request

//This is how the function would look in Meteor server code

    S3.putObject({

    Seau : "ShareThismagasin de souvenirs",

    Key: clé,

    Body: données

    }, function(err, result){

    if(result){

      console.log("Done") ;

      //optionally pass in callback

    }

    });

"'

Le code ci-dessus ne fonctionnera pas comme prévu, comme le rappel à S3. putObject n'est pas lié à la fibre actuelle

Dans ce cas d'utilisation, nous utilisons Meteor. wrapAsync et encapsuler la fonction asynchrone dans la fibre actuelle

# # #What est-ce que Meteor. wrapAsync faire?

Meteor. wrapAsync prend la méthode que vous lui donnez comme premier paramètre et l'exécute dans la fibre actuelle.

Il y attache également un rappel (il suppose le style de nœud traditionnel de l'utilisation d'un rappel, qui est la méthode prend un rappel comme paramètre final avec deux arguments (erreur et résultat) dont l'un sera null en fonction du résultat de l'appel

Le rappel est lié à Meteor. bindEnvironment et bloque la fibre actuelle jusqu'à ce que le rappel soit déclenché. Dès que le rappel se déclenche, il renvoie le résultat ou lève l'erreur.

"'JavaScript

function synchronousFunc(){

Return Meteor. wrapAsync (asyncFunction)

}

"'

* * Comment pouvons-nous accéder à l'objet Error en utilisant les fonctions synchrones encapsulées retournées par Meteor. wrapAsync? * *

Une méthode utilise des blocs try/catch, car en cas d'erreur, elle sera levée par la fonction Sync au lieu d'être passée comme premier argument du rappel de fonction Async.

"'

essayer{

var result = synchronousFunc (params);

Console. log ("succès:", résultat);

}

catch(error){

Console. log ("erreur:", erreur);

}

// which is equivalent to –

asyncFunction(params,function(error,result){

if (erreur)

    Console. log ("erreur", erreur);

Autre

    Console. log ("résultat:", result);

});

"'

Ceci est idéal pour convertir du code asynchrone en code synchrone puisque vous pouvez utiliser le résultat de la méthode sur la ligne suivante au lieu d'utiliser un rappel et/ou des fonctions plus profondes d'imbrication. Il prend même soin de lier le rappel à la fibre actuelle (en utilisant Meteor. bindEnvironment) pour vous.

Une dernière remarque, si vous voulez que le rappel à la fonction de bibliothèque asynchrone fasse quelque chose de plus (juste parce que) vous devez utiliser Meteor. bindEnvironment explicitement ou bien vous obtenez une erreur indiquant que le code Meteor doit toujours s'exécuter dans une fibre.

"'

var func = function(cb){

    S3.putObject(params, Meteor.bindEnvironment(function(err, data) {

      if (err){

       Jetez un nouveau météore. erreur ("le stockage sur S3 a échoué");

      } else{

        Console. log ("données stockées avec succès sur S3");

          CB (null, données);

    }

    }));

 };

Return (Meteor. wrapAsync (Func)) ();

"'

Quelques gotchas que vous devez être conscient de lors de l'utilisation Meteor. wrapAsync

Il est destiné à fonctionner avec des fonctions asynchrones pures qui s'attendent à un rappel avec l'erreur et le résultat comme arguments. En outre, ils ne fonctionnent que sur le côté serveur (puisque vous ne pouvez pas utiliser des fibres sur le côté client)

Les méthodes côté serveur telles que Meteor. HTTP. Call sont déjà encapsulées de cette façon. Si vous l'appelez sans rappel, la méthode se bloque jusqu'à ce que la réponse soit reçue. Sinon, il reviendra immédiatement, puis exécutera le rappel une fois la réponse réseau reçue.

À propos de ShareThis

Depuis 2007,ShareThis libère la puissance du comportement numérique mondial en synthétisant les données relatives aux partages sociaux, aux intérêts et aux intentions. Grâce au comportement des consommateurs sur plus de trois millions de domaines mondiaux, ShareThis observe les actions en temps réel de personnes réelles sur des destinations numériques réelles.

S'abonner à notre newsletter

Recevez les dernières nouvelles, les conseils et les mises à jour

S'abonner

Contenu connexe