La promessa sarà sempre registrata in sospeso fino a quando i suoi risultati non saranno ancora risolti. È necessario chiamare .thenla promessa per acquisire i risultati indipendentemente dallo stato della promessa (risolta o ancora in sospeso):
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"
})
Perché?
Le promesse sono solo una direzione in avanti; Puoi risolverli solo una volta. Il valore risolto di a Promiseviene passato ai suoi metodi .theno .catch.
Dettagli
Secondo le specifiche Promises / A +:
La procedura di risoluzione della promessa è un'operazione astratta che prende come input una promessa e un valore, che indichiamo come [[Risolvi]] (promessa, x). Se x è una variabile, tenta di fare in modo che la promessa adotti lo stato di x, assumendo che x si comporti almeno in qualche modo come una promessa. Altrimenti, soddisfa la promessa con il valore x.
Questo trattamento degli oggetti di valore consente alle implementazioni delle promesse di interagire, purché espongano un metodo conforme alle promesse / A +. Consente inoltre alle implementazioni Promises / A + di "assimilare" implementazioni non conformi con metodi ragionevoli.
Questa specifica è un po 'difficile da analizzare, quindi analizziamola. La regola è:
Se la funzione nel .thengestore restituisce un valore, allora si Promiserisolve con quel valore. Se il gestore ne restituisce un altro Promise, l'originale si Promiserisolve con il valore risolto del concatenato Promise. Il .thengestore successivo conterrà sempre il valore risolto della promessa concatenata restituita nel precedente .then.
Il modo in cui funziona effettivamente è descritto di seguito in modo più dettagliato:
1. Il ritorno della .thenfunzione sarà il valore risolto della 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 la .thenfunzione restituisce a Promise, il valore risolto di quella promessa concatenata viene passato al seguente .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"
});