Estoy usando Meteor, ¿qué debo hacer para esperar a que se devuelva la promesa de una llamada API?
balanced-payments (3)
Actualiza esta línea
var customer = Meteor._wrapAsync(balanced.marketplace.customer.create)();
if (Meteor.isClient) {
Template.hello.events({
''click input'': function () {
//create a new customer
Meteor.call(''createCustomer'', function (error, result) {
console.log("Error: " + error + " Result: " + result); } );
}
});
}
if (Meteor.isServer) {
Meteor.methods({
createCustomer: function () {
try {
balanced.configure(''MyBalancedPaymentsTestKey'');
var customer = Meteor._wrapAsync(balanced.marketplace.customers.create());
var callCustomer = customer();
var returnThis = console.log(JSON.stringify(callCustomer, false, 4));
return returnThis;
} catch (e) {
console.log(e);
var caughtFault = JSON.stringify(e, false, 4);
}
return caughtFault;
}
});
}
Y acabo de usar el mundo hola predeterminado sin la línea de saludos.
<head>
<title>testCase</title>
</head>
<body>
{{> hello}}
</body>
<template name="hello">
<h1>Hello World!</h1>
<input type="button" value="Click" />
</template>
En el lado del cliente, el registro se imprime
Error: undefined Result: {}
En el lado del servidor, el registro se imprime
[TypeError: Object [object Promise] has no method ''apply'']
¿Alguna idea de cómo puedo esperar esa promesa en lugar de devolver el resultado en blanco?
Otro enfoque es usar futuros. Uso mucho esto en el servidor para esperar a que los resultados vuelvan al cliente.
Aquí hay un pequeño ejemplo de eso que uso para los inicios de sesión:
Accounts.login(function (req, user) {
var Future = Npm.require("fibers/future");
var fut = new Future();
HTTP.call("POST", globals.server + ''api/meteor-approvals/token'',
{
timeout: 10000, followRedirects: true,
headers: {
''Content-Type'': ''application/x-www-form-urlencoded''
},
params: {
username: userName,
password: req.password
}},
function (err, result) {
if (err) {
logger.error("Login error: " + err);
fut.throw(err);
}
else {
fut.return("Success");
}
}
);
return fut.wait();
}
Supongo que balanced.marketplace.customers.create
devuelve una promesa Promises / A +. Este es un objeto con un método .then(fulfillmentCallback, rejectionCallback)
- se llama a fulfillmentCallback
cuando la operación tiene éxito, y se llama a .then(fulfillmentCallback, rejectionCallback)
si la operación tuvo un error. A continuación, le mostramos cómo podría usar Futures para obtener de forma sincrónica el valor de una promesa:
var Future = Npm.require("fibers/future");
function extractFromPromise(promise) {
var fut = new Future();
promise.then(function (result) {
fut["return"](result);
}, function (error) {
fut["throw"](error);
});
return fut.wait();
}
Entonces puede simplemente llamar a balanced.marketplace.customers.create
normalmente (no _wrapAsync
) para obtener una promesa, luego llame a extractFromPromise
sobre esa promesa para obtener el valor real del resultado. Si hay un error, extractFromPromise
lanzará una excepción.
Por cierto, el código en los bloques if (Meteor.isServer)
aún se envía al cliente (incluso si el cliente no lo ejecuta), por lo que no quiere poner su clave API allí. Puede poner el código en el directorio del server
y Meteor no lo enviará al cliente.