A promessa sempre será registrada pendente, desde que seus resultados ainda não sejam resolvidos. Você deve invocar .thena promessa para capturar os resultados, independentemente do estado da promessa (resolvida ou ainda pendente):
let AuthUser = function(data) {
return google.login(data.username, data.password).then(token => { return token } )
}
let userToken = AuthUser(data)
console.log(userToken) // Promise { <pending> }
userToken.then(function(result) {
console.log(result) // "Some User token"
})
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 .thenou .catch.
Detalhes
De acordo com a especificação Promises / A +:
O procedimento de resolução de promessa é uma operação abstrata tomando como entrada uma promessa e um valor, que denotamos como [[Resolver]] (promessa, x). Se x for um então, ele tenta fazer a promessa adotar o estado de x, sob a suposição de que x se comporta pelo menos um pouco como uma promessa. Caso contrário, cumpre a promessa com o valor x.
Esse tratamento dos objetos permite que implementações promissoras interoperem, contanto que exponham um método then compatível com Promises / A +. Também permite que as implementações do Promises / A + “assimilem” implementações não conformes com métodos then razoáveis.
Esta especificação é um pouco difícil de analisar, então vamos decompô-la. A regra é:
Se a função no .thenmanipulador retornar um valor, o será Promiseresolvido com esse valor. Se o manipulador retornar outro Promise, o original será Promiseresolvido com o valor resolvido do encadeado Promise. O próximo .thenmanipulador 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 .thenfunção será o valor resolvido da promessa.
function initPromise() {
return new Promise(function(res, rej) {
res("initResolve");
})
}
initPromise()
.then(function(result) {
console.log(result); // "initResolve"
return "normalReturn";
})
.then(function(result) {
console.log(result); // "normalReturn"
});
2. Se a .thenfunção retornar a Promise, o valor resolvido dessa promessa encadeada será passado para o seguinte .then.
function initPromise() {
return new Promise(function(res, rej) {
res("initResolve");
})
}
initPromise()
.then(function(result) {
console.log(result); // "initResolve"
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve("secondPromise");
}, 1000)
})
})
.then(function(result) {
console.log(result); // "secondPromise"
});