La promessa sarà sempre registrata in sospeso fino a quando i suoi risultati non saranno ancora risolti. È necessario chiamare .then
la 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 Promise
viene passato ai suoi metodi .then
o .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 .then
gestore restituisce un valore, allora si Promise
risolve con quel valore. Se il gestore ne restituisce un altro Promise
, l'originale si Promise
risolve con il valore risolto del concatenato Promise
. Il .then
gestore 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 .then
funzione 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 .then
funzione 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"
});