valores valor una sincronas retornar programacion pasar otra funciones funcion entre ejemplos dentro asincrona javascript meteor

sincronas - retornar valor de una funcion javascript



Meteor: llamar a una función asincrónica dentro de Meteoro.method y devolver el resultado (4)

Andrew Mao tiene razón. Meteor ahora tiene Meteor.wrapAsync() para este tipo de situación.

Esta es la forma más sencilla de hacer una carga por banda y también pasar una función de devolución de llamada:

var stripe = StripeAPI("key"); Meteor.methods({ yourMethod: function(callArg) { var charge = Meteor.wrapAsync(stripe.charges.create, stripe.charges); charge({ amount: amount, currency: "usd", //I passed the stripe token in callArg card: callArg.stripeToken, }, function(err, charge) { if (err && err.type === ''StripeCardError'') { // The card has been declined throw new Meteor.Error("stripe-charge-error", err.message); } //Insert your ''on success'' code here }); } });

Encontré esta publicación realmente útil: Meteor: uso apropiado de Meteor.wrapAsync en el servidor

Quiero llamar a una función asincrónica dentro de un método Meteor y luego devolver el resultado de esa función a Meteor.call.

(¿Cómo es eso posible?

Meteor.methods({ my_function: function(arg1, arg2) { //Call other asynchronous function and return result or throw error } });


Las versiones recientes de Meteor han proporcionado la función Meteor._wrapAsync no Meteor._wrapAsync que convierte una función con una devolución de llamada estándar (err, res) en una función síncrona, lo que significa que la fibra actual rinde hasta que vuelve la devolución de llamada, y luego usa Meteor.bindEnvironment para garantizar que conserva las variables de entorno de Meteor actuales (como Meteor.userId()) .

Un uso simple sería como el siguiente:

asyncFunc = function(arg1, arg2, callback) { // callback has the form function (err, res) {} }; Meteor.methods({ "callFunc": function() { syncFunc = Meteor._wrapAsync(asyncFunc); res = syncFunc("foo", "bar"); // Errors will be thrown } });

Es posible que también necesite usar la function#bind para asegurarse de que se llama a asyncFunc con el contexto correcto antes de envolverlo.

Para obtener más información, consulte: https://www.eventedmind.com/tracks/feed-archive/meteor-meteor-wrapasync


Otra opción es este package que logra los objetivos similares.

meteor add meteorhacks:async

Del paquete README:

Async.wrap (función)

Ajustar una función asincrónica y permitir que se ejecute dentro de Meteor sin devoluciones de llamada.

//declare a simple async function function delayedMessge(delay, message, callback) { setTimeout(function() { callback(null, message); }, delay); } //wrapping var wrappedDelayedMessage = Async.wrap(delayedMessge); //usage Meteor.methods({ ''delayedEcho'': function(message) { var response = wrappedDelayedMessage(500, message); return response; } });


Use un futuro para hacerlo. Me gusta esto:

Meteor.methods({ my_function: function(arg1, arg2) { // Set up a future var fut = new Future(); // This should work for any async method setTimeout(function() { // Return the results fut.ret(message + " (delayed for 3 seconds)"); }, 3 * 1000); // Wait for async to finish before returning // the result return fut.wait(); } });

Actualización :

Para usar Future a partir de Meteor 0.5.1, debe ejecutar el siguiente código en su método Meteor.startup:

Meteor.startup(function () { var require = __meteor_bootstrap__.require Future = require(''fibers/future''); // use Future here });

Actualización 2 :

Para usar Future a partir de Meteor 0.6, debe ejecutar el siguiente código en su método Meteor.startup:

Meteor.startup(function () { Future = Npm.require(''fibers/future''); // use Future here });

y luego usa el método de return lugar del método ret :

Meteor.methods({ my_function: function(arg1, arg2) { // Set up a future var fut = new Future(); // This should work for any async method setTimeout(function() { // Return the results fut[''return''](message + " (delayed for 3 seconds)"); }, 3 * 1000); // Wait for async to finish before returning // the result return fut.wait(); } });

Mira esta esencia .