La promesse sera toujours enregistrée en attente tant que ses résultats ne sont pas encore résolus. Vous devez faire appel .thenà la promesse pour capturer les résultats quel que soit l'état de la promesse (résolu ou toujours en attente):
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"
})
Pourquoi donc?
Les promesses sont uniquement orientées vers l'avant; Vous ne pouvez les résoudre qu'une seule fois. La valeur résolue de a Promiseest transmise à ses méthodes .thenou .catch.
Détails
Selon les promesses / spécifications A +:
La procédure de résolution de promesse est une opération abstraite prenant comme entrée une promesse et une valeur, que nous notons [[Resolve]] (promise, x). Si x est un alorsable, il tente de faire adopter par promesse l'état de x, sous l'hypothèse que x se comporte au moins un peu comme une promesse. Sinon, il tient la promesse avec la valeur x.
Ce traitement des thenables permet aux implémentations de promesse d'interopérer, tant qu'elles exposent une méthode alors conforme à Promises / A +. Il permet également aux implémentations Promises / A + «d'assimiler» les implémentations non conformes avec des méthodes alors raisonnables.
Cette spécification est un peu difficile à analyser, alors décomposons-la. La règle est:
Si la fonction dans le .thengestionnaire renvoie une valeur, alors la Promiserésolution avec cette valeur. Si le gestionnaire en renvoie un autre Promise, l'original est Promiserésolu avec la valeur résolue de la chaîne Promise. Le .thengestionnaire suivant contiendra toujours la valeur résolue de la promesse chaînée retournée dans le précédent .then.
La façon dont cela fonctionne réellement est décrite ci-dessous plus en détail:
1. Le retour de la .thenfonction sera la valeur résolue de la promesse.
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. Si la .thenfonction renvoie a Promise, la valeur résolue de cette promesse chaînée est transmise au suivant .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"
});