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):
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 .then
ou .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 .then
manipulador retornar um valor, o será Promise
resolvido com esse valor. Se o manipulador retornar outro Promise
, o original será Promise
resolvido com o valor resolvido do encadeado Promise
. 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.
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 .then
funçã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"
});