Meu código:
let AuthUser = data => {
return google.login(data.username, data.password).then(token => { return token } )
}
E quando tento executar algo assim:
let userToken = AuthUser(data)
console.log(userToken)
Estou entendendo:
Promise { <pending> }
Mas por que?
Meu principal objetivo é obter um token do google.login(data.username, data.password)
qual retorna uma promessa, em uma variável. E só então realizar algumas ações.
getFirstUser
funçãoRespostas:
A promessa sempre será registrada pendente, desde que seus resultados ainda não sejam resolvidos. Você deve invocar
.then
a promessa para capturar os resultados, independentemente do estado da promessa (resolvida ou ainda pendente):Por que é que?
As promessas são direcionadas apenas para a frente; Você só pode resolvê-los uma vez. O valor resolvido de a
Promise
é passado para seus métodos.then
ou.catch
.Detalhes
De acordo com a especificação Promises / A +:
Esta especificação é um pouco difícil de analisar, então vamos decompô-la. A regra é:
Se a função no
.then
manipulador retornar um valor, o seráPromise
resolvido com esse valor. Se o manipulador retornar outroPromise
, o original seráPromise
resolvido com o valor resolvido do encadeadoPromise
. O próximo.then
manipulador sempre conterá o valor resolvido da promessa encadeada retornada na anterior.then
.A maneira como realmente funciona é descrita abaixo com mais detalhes:
1. O retorno da
.then
função será o valor resolvido da promessa.2. Se a
.then
função retornar aPromise
, o valor resolvido dessa promessa encadeada será passado para o seguinte.then
.fonte
Uncaught SyntaxError: Unexpected token .
. O segundo precisa ser devolvido paraPromise
.then
uma função não invocada. atualizou a respostaSei que essa pergunta foi feita há 2 anos, mas me deparei com o mesmo problema e a resposta para o problema é desde ES6, que você pode simplesmente
await
as funções retornar valor, como:fonte
.then(token => return token)
, isso é apenas uma passagem desnecessária. Basta retornar a chamada de login do google.await
fora de uma função assíncrona. Talvez o melhor exemplo aqui seja fazer aAuthUser
funçãoasync
, que termina comreturn await google.login(...);
O
then
método retorna uma promessa pendente que pode ser resolvida de forma assíncrona pelo valor de retorno de um manipulador de resultados registrado na chamada parathen
, ou rejeitado lançando um erro dentro do manipulador chamado.Portanto, a chamada
AuthUser
não logará repentinamente o usuário de forma síncrona, mas retornará uma promessa cujos manipuladores registrados serão chamados depois que o login for bem-sucedido (ou falhar). Eu sugeriria acionar todo o processamento de login por umathen
cláusula da promessa de login. EG usando funções nomeadas para destacar a sequência de fluxo:fonte
Consulte a seção MDN sobre Promessas. Em particular, observe o tipo de retorno de then ().
Para efetuar login, o agente do usuário deve enviar uma solicitação ao servidor e aguardar o recebimento de uma resposta. Já que fazer seu aplicativo parar totalmente a execução durante uma viagem de ida e volta de solicitação geralmente causa uma experiência ruim para o usuário, praticamente todas as funções JS que conectam você (ou realizam qualquer outra forma de interação do servidor) usarão uma promessa ou algo muito parecido , para entregar resultados de forma assíncrona.
Agora, observe também que as
return
instruções são sempre avaliadas no contexto da função em que aparecem. Então, quando você escreveu:a instrução
return token;
significava que a função anônima sendo passadathen()
deveria retornar o token, não que aAuthUser
função deveria. O queAuthUser
retorna é o resultado do chamadogoogle.login(username, password).then(callback);
, que passa a ser uma promessa.Em última análise, seu retorno de chamada
token => { return token; }
não faz nada; em vez disso, sua entrada parathen()
precisa ser uma função que realmente lida com o token de alguma forma.fonte
return
a nova sintaxe de encerramento (ish) é tratada, nesse caso - bem, desaprovo veementemente isso, mas o erro ainda é meu e peço desculpas por ele.token => { return token; }
não faz nada ao invés de alegar que era contraproducente. Você pode dizergoogle.login(username, password).then(token=>{return token;}).then(token=>{return token;})
e assim por diante para sempre, mas só conseguirá retornar umPromise
que resolva com um token - o mesmo como se tivesse deixado comogoogle.login(username, password);
. Não sei por que você acha que isso é "muito errado".return token
que não funciona como o OP provavelmente esperava.promise.then(result => { return result; })
exatamente equivalente apromise
, portanto, a chamada do método não faz nada e deve ser descartada para simplificar o código e melhorar a legibilidade - uma declaração que é completamente verdadeira.Sua promessa está pendente, conclua-a até
após o código restante. Tudo o que esse código faz é
.then()
completar sua promessa e capturar o resultado final na variável de resultado e imprimir o resultado no console. Lembre-se de que você não pode armazenar o resultado em uma variável global. Espero que essa explicação possa ajudá-lo.fonte