Meteor: uso de bibliotecas sincrónicas – wrapAsync y bindEnvironment
# # #Whats meteoro. wrapAsync y Meteor. bindEnvironment?
En la parte 1, vimos cómo Meteor resumieron el código asincrónico usando fibras y proporcionó una manera fácil de escribir JS en un estilo sincrónico. En la parte 2 entendemos cómo trabajar con bibliotecas asincrónicas puras
Usando fibras podemos modificar una función asincrónica, para escribir código síncrono como. Sin embargo, ¿qué sucede cuando no podemos modificar la función como en el caso de las bibliotecas de terceros?
En ShareThis , nuestra aplicación Meteor utiliza el S3 de Amazon como una capa de caché y almacenamiento de datos. Desde la documentación de Amazon S3, la firma del método JavaScript para agregar a un cubo S3 se ve como
"'
getObject(params = {}, callback) ⇒ AWS.Request
//This is how the function would look in Meteor server code
S3.putObject({
Bucket: ' ShareThis -Insights-Store ',
Llave: llave,
Cuerpo: datos
}, function(err, result){
si(resultado){
console.log ("Hecho");
//optionally pass in callback
}
});
"'
El código anterior no funcionará como se esperaba, ya que la devolución de llamada a S3. putObject no está enlazada a la fibra actual
En este caso de uso, utilizamos Meteor. wrapAsync y para envolver la función asincrónica en la fibra actual
# # #What hace Meteor. wrapAsync?
Meteor. wrapAsync toma en el método que se le da como el primer parámetro y lo ejecuta en la fibra actual.
También le une una devolución de llamada (se asume el estilo de nodo tradicional de utilizar una devolución de llamada, que es el método toma una devolución de llamada como su parámetro final con dos argumentos (error y resultado) de los cuales cualquiera de ellos será nulo en función del resultado de la llamada
La devolución de llamada está enlazada con Meteor. bindEnvironment y bloquea la fibra actual hasta que se dispara la devolución de llamada. Tan pronto como se desencadene la devolución de llamada, devuelve el resultado o produce el error.
"' JavaScript
function synchronousFunc(){
retorno Meteor. wrapAsync (asyncFunction)
}
"'
* * ¿Cómo accedemos al objeto de error utilizando las funciones síncronas envueltas por Meteor. wrapAsync? * *
Un método está utilizando bloques try/catch, porque en caso de error, será lanzado por la función Sync en lugar de ser pasado como primer argumento de la función asincrónica callback.
"'
probar{
var result = synchronousFunc (params);
Console. log ("Success:", result);
}
catch(error){
Console. log ("error:", error);
}
// which is equivalent to –
asyncFunction(params,function(error,result){
if (error)
Console. log ("error", error);
Más
Console. log ("resultado:", resultado);
});
"'
Esto es ideal para convertir código asincrónico en código sincrónico, ya que puede utilizar el resultado del método en la línea siguiente en lugar de utilizar una función de devolución de llamada y/o anidación de funciones más profundas. Incluso se encarga de enlazar la devolución de llamada a la fibra actual (utilizando Meteor. bindEnvironment) para usted.
Una última nota, si desea que la devolución de llamada a la función de biblioteca asincrónica para hacer algo más (sólo porque) usted tiene que utilizar Meteor. bindEnvironment explícitamente o bien usted consigue un error que indica que el código del meteorito debe funcionar siempre dentro de una fibra.
"'
var func = function(cb){
S3.putObject(params, Meteor.bindEnvironment(function(err, data) {
si (err){
lanzar nuevo Meteor. error ("almacenamiento en S3 failed");
} si no{
Console. log ("datos almacenados con éxito en S3");
CB (NULL, datos);
}
}));
};
retorno (Meteor. wrapAsync (Func)) ();
"'
Pocos Gotchas que usted necesita para ser consciente de cuando se utiliza Meteor. wrapAsync
Se supone que funciona con funciones asincrónicas puras que esperan una devolución de llamada con error y resultan como argumentos. Además, sólo funcionan en el lado del servidor (ya que no se pueden utilizar fibras en el lado del cliente)
Los métodos del lado del servidor como Meteor. HTTP. Call ya están envueltos de esta manera. Si lo llama sin una devolución de llamada, el método se bloqueará hasta que se reciba la respuesta. De lo contrario, volverá inmediatamente y luego ejecutará la devolución de llamada una vez que se reciba la respuesta de red.