Das Versprechen wird immer ausstehend protokolliert, solange die Ergebnisse noch nicht geklärt sind. Sie müssen .thendas Versprechen aufrufen , um die Ergebnisse unabhängig vom Versprechungsstatus (gelöst oder noch ausstehend) zu erfassen:
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"
})
Warum ist das so?
Versprechen sind nur Vorwärtsrichtung; Sie können sie nur einmal lösen. Der aufgelöste Wert von a Promisewird an seine .thenoder .catchMethoden übergeben.
Einzelheiten
Gemäß der Promises / A + Spezifikation:
Das Versprechenlösungsverfahren ist eine abstrakte Operation, bei der ein Versprechen und ein Wert als Eingabe verwendet werden, die wir als [[Auflösen]] (Versprechen, x) bezeichnen. Wenn x ein dannable ist, versucht es, das Versprechen dazu zu bringen, den Zustand von x anzunehmen, unter der Annahme, dass sich x zumindest etwas wie ein Versprechen verhält. Ansonsten erfüllt es das Versprechen mit dem Wert x.
Diese Behandlung von thenables ermöglicht die Interoperation von Versprechen-Implementierungen, solange sie eine Promises / A + -konforme then-Methode offenlegen. Es ermöglicht Promises / A + -Implementierungen auch, nicht konforme Implementierungen mit angemessenen Methoden zu „assimilieren“.
Diese Spezifikation ist etwas schwer zu analysieren, also lasst es uns zusammenfassen. Die Regel lautet:
Wenn die Funktion im .thenHandler einen Wert zurückgibt, wird der Promisemit diesem Wert aufgelöst. Wenn der Handler einen anderen zurückgibt Promise, wird das Original Promisemit dem aufgelösten Wert der verketteten aufgelöst Promise. Der nächste .thenHandler enthält immer den aufgelösten Wert des verketteten Versprechens, das im vorhergehenden zurückgegeben wurde .then.
Die Art und Weise, wie es tatsächlich funktioniert, wird nachstehend ausführlicher beschrieben:
1. Die Rückgabe der .thenFunktion ist der aufgelöste Wert des Versprechens.
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. Wenn die .thenFunktion a zurückgibt Promise, wird der aufgelöste Wert dieses verketteten Versprechens an Folgendes übergeben .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"
});