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 Promise
est transmise à ses méthodes .then
ou .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 .then
gestionnaire renvoie une valeur, alors la Promise
résolution avec cette valeur. Si le gestionnaire en renvoie un autre Promise
, l'original est Promise
résolu avec la valeur résolue de la chaîne Promise
. Le .then
gestionnaire 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 .then
fonction 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 .then
fonction 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"
});