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 .