Mi código:
let AuthUser = data => {
return google.login(data.username, data.password).then(token => { return token } )
}
Y cuando intento ejecutar algo como esto:
let userToken = AuthUser(data)
console.log(userToken)
Me estoy poniendo:
Promise { <pending> }
¿Pero por qué?
Mi objetivo principal es obtener un token del google.login(data.username, data.password)
que devuelve una promesa, en una variable. Y solo entonces realizar algunas acciones.
getFirstUser
funciónRespuestas:
La promesa siempre se registrará como pendiente siempre que sus resultados aún no se hayan resuelto. Debe recurrir
.then
a la promesa para capturar los resultados independientemente del estado de la promesa (resuelto o aún pendiente):¿Porqué es eso?
Las promesas son solo una dirección hacia adelante; Solo puede resolverlos una vez. El valor resuelto de a
Promise
se pasa a sus métodos.then
o.catch
.Detalles
De acuerdo con la especificación Promises / A +:
Esta especificación es un poco difícil de analizar, así que analicémosla. La regla es:
Si la función en el
.then
controlador devuelve un valor, entonces sePromise
resuelve con ese valor. Si el manejador devuelve otroPromise
, entonces el original sePromise
resuelve con el valor resuelto del encadenadoPromise
. El siguiente.then
controlador siempre contendrá el valor resuelto de la promesa encadenada devuelta en el anterior.then
.La forma en que realmente funciona se describe a continuación con más detalle:
1. La devolución de la
.then
función será el valor resuelto de la promesa.2. Si la
.then
función devuelve unPromise
, entonces el valor resuelto de esa promesa encadenada se pasa a lo siguiente.then
.fuente
Uncaught SyntaxError: Unexpected token .
. El segundo necesita una devolución paraPromise
.then
en una función no invocada. actualizó la respuestaSé que esta pregunta se hizo hace 2 años, pero me encontré con el mismo problema y la respuesta al problema es que desde ES6, simplemente puede que
await
las funciones devuelvan valor, como:fuente
.then(token => return token)
, eso es solo un paso a través innecesario. Simplemente devuelva la llamada de inicio de sesión de Google.await
fuera de una función asíncrona. Quizás el mejor ejemplo aquí sería hacer laAuthUser
funciónasync
, que luego termina conreturn await google.login(...);
El
then
método devuelve una promesa pendiente que puede resolverse de forma asincrónica mediante el valor de retorno de un controlador de resultados registrado en la llamada athen
, o rechazada arrojando un error dentro del controlador llamado.Por lo tanto, las llamadas
AuthUser
no registrarán repentinamente al usuario de forma síncrona, sino que devolverán una promesa cuyos controladores registrados en ese momento serán llamados después de que el inicio de sesión sea exitoso (o no). Sugeriría activar todo el procesamiento de inicio de sesión mediante unathen
cláusula de la promesa de inicio de sesión. EG usando funciones nombradas para resaltar la secuencia de flujo:fuente
Consulte la sección MDN sobre promesas. En particular, observe el tipo de devolución de then ().
Para iniciar sesión, el agente de usuario debe enviar una solicitud al servidor y esperar a recibir una respuesta. Dado que hacer que su aplicación detenga por completo la ejecución durante un viaje de ida y vuelta de solicitud generalmente genera una mala experiencia de usuario, prácticamente todas las funciones de JS que lo inician (o realizan cualquier otra forma de interacción con el servidor) usarán una Promesa, o algo muy parecido , para entregar resultados de forma asincrónica.
Ahora, observe también que las
return
declaraciones siempre se evalúan en el contexto de la función en la que aparecen. Entonces, cuando escribió:la declaración
return token;
significaba que la función anónima a la que se pasathen()
debería devolver el token, no que laAuthUser
función debería. Lo queAuthUser
regresa es el resultado de llamargoogle.login(username, password).then(callback);
, que resulta ser una Promesa.En última instancia, su devolución de llamada
token => { return token; }
no hace nada; en cambio, su entrada athen()
debe ser una función que realmente maneje el token de alguna manera.fuente
return
se trata con la nueva (ish) sintaxis de cierre, en cuyo caso, bueno, lo desapruebo enérgicamente, pero el error sigue siendo mío y me disculpo por ello.token => { return token; }
no hace nada en lugar de afirmar que es contraproducente. Puede decirgoogle.login(username, password).then(token=>{return token;}).then(token=>{return token;})
y así sucesivamente para siempre, pero solo logrará devolver unPromise
que se resuelva con un token, lo mismo que si lo dejara comogoogle.login(username, password);
. No estoy seguro de por qué siente que esto está "muy mal".return token
no funciona como probablemente esperaba el OP.promise.then(result => { return result; })
es exactamente equivalente apromise
, por lo tanto, la llamada al método no hace nada y debe eliminarse para simplificar el código y mejorar la legibilidad, una declaración que es completamente cierta.Tu promesa está pendiente, complétala antes de
después de su código restante. Todo lo que hace este código es que
.then()
completa su promesa y captura el resultado final en la variable de resultado y el resultado de impresión en la consola. Tenga en cuenta que no puede almacenar el resultado en una variable global. Espero que esa explicación te ayude.fuente