Das Versprechen wird immer ausstehend protokolliert, solange die Ergebnisse noch nicht geklärt sind. Sie müssen .then
das 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 Promise
wird an seine .then
oder .catch
Methoden ü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 .then
Handler einen Wert zurückgibt, wird der Promise
mit diesem Wert aufgelöst. Wenn der Handler einen anderen zurückgibt Promise
, wird das Original Promise
mit dem aufgelösten Wert der verketteten aufgelöst Promise
. Der nächste .then
Handler 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 .then
Funktion 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 .then
Funktion 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"
});