Mein Code:
let AuthUser = data => {
return google.login(data.username, data.password).then(token => { return token } )
}
Und wenn ich versuche, so etwas auszuführen:
let userToken = AuthUser(data)
console.log(userToken)
Ich erhalte:
Promise { <pending> }
Aber wieso?
Mein Hauptziel ist es, ein Token, von google.login(data.username, data.password)
dem ein Versprechen zurückgegeben wird, in eine Variable zu verwandeln. Und erst dann einige Aktionen durchführen.
getFirstUser
FunktionAntworten:
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: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:
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 derPromise
mit diesem Wert aufgelöst. Wenn der Handler einen anderen zurückgibtPromise
, wird das OriginalPromise
mit dem aufgelösten Wert der verketteten aufgelöstPromise
. 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.2. Wenn die
.then
Funktion a zurückgibtPromise
, wird der aufgelöste Wert dieses verketteten Versprechens an Folgendes übergeben.then
.quelle
Uncaught SyntaxError: Unexpected token .
. Der zweite braucht eine Rückkehr fürPromise
.then
auf eine nicht aufgerufene Funktion. aktualisierte die AntwortIch weiß, dass diese Frage vor 2 Jahren gestellt wurde, aber ich stoße auf dasselbe Problem und die Antwort auf das Problem lautet seit ES6, dass Sie einfach
await
die Funktionen zurückgeben können, wie zum Beispiel:quelle
.then(token => return token)
, das ist nur ein unnötiger Passthrough. Geben Sie einfach den Google-Login-Anruf zurück.await
außerhalb einer asynchronen Funktion verwenden. Vielleicht wäre das bessere Beispiel hier, dieAuthUser
Funktion zu machenasync
, die dann endet mitreturn await google.login(...);
Die
then
Methode gibt ein ausstehendes Versprechen zurück, das asynchron durch den Rückgabewert eines im Aufruf an registrierten Ergebnishandlers aufgelöstthen
oder durch Auslösen eines Fehlers im aufgerufenen Handler zurückgewiesen werden kann.Ein Anruf
AuthUser
meldet den Benutzer also nicht plötzlich synchron an, sondern gibt ein Versprechen zurück, dessen dann registrierte Handler aufgerufen werden, nachdem die Anmeldung erfolgreich war (oder fehlschlägt). Ich würde vorschlagen, die gesamte Anmeldeverarbeitung durch einethen
Klausel des Anmeldeversprechens auszulösen . EG verwendet benannte Funktionen, um die Abfolge des Flusses hervorzuheben:quelle
Siehe den MDN-Abschnitt zu Versprechen. Schauen Sie sich insbesondere den Rückgabetyp von then () an.
Um sich anzumelden, muss der Benutzeragent eine Anfrage an den Server senden und auf eine Antwort warten. Da die Ausführung Ihrer Anwendung während eines Anforderungsrundgangs normalerweise zu einer schlechten Benutzererfahrung führt, verwendet praktisch jede JS-Funktion, die Sie anmeldet (oder eine andere Form der Serverinteraktion ausführt), ein Versprechen oder etwas Ähnliches , um Ergebnisse asynchron zu liefern.
Beachten Sie jetzt auch, dass
return
Anweisungen immer im Kontext der Funktion ausgewertet werden, in der sie erscheinen. Wenn Sie also geschrieben haben:Die Anweisung
return token;
bedeutete, dass die anonyme Funktion, anthen()
die übergeben wird, das Token zurückgeben sollte, nicht dass dieAuthUser
Funktion sollte. WasAuthUser
zurückkommt, ist das Ergebnis eines Anrufsgoogle.login(username, password).then(callback);
, der zufällig ein Versprechen ist.Letztendlich macht Ihr Rückruf
token => { return token; }
nichts; Stattdessen muss Ihre Eingabe anthen()
eine Funktion sein, die das Token tatsächlich auf irgendeine Weise verarbeitet.quelle
return
mit der neuen (ish) Abschlusssyntax umgegangen wird. In diesem Fall lehne ich das stark ab, aber der Fehler liegt immer noch bei mir und ich entschuldige mich dafür.token => { return token; }
nichts tut, anstatt zu behaupten, er sei kontraproduktiv. Sie können für immer sagengoogle.login(username, password).then(token=>{return token;}).then(token=>{return token;})
und so weiter, aber Sie werden nur eine Rückgabe erreichenPromise
, die mit einem Token aufgelöst wird - so, als hätten Sie es einfach so gelassengoogle.login(username, password);
. Ich bin mir nicht sicher, warum Sie das für "sehr falsch" halten.return token
es nicht so funktioniert, wie es das OP wahrscheinlich erwartet hat.promise.then(result => { return result; })
genau gleichbedeutend mitpromise
, daher bewirkt der Methodenaufruf nichts und sollte gelöscht werden, um den Code zu vereinfachen und die Lesbarkeit zu verbessern - eine Aussage, die völlig richtig ist.Ihr Versprechen steht noch aus. Vervollständigen Sie es bis
nach Ihrem verbleibenden Code. Dieser Code erfüllt
.then()
lediglich Ihr Versprechen und erfasst das Endergebnis in der Ergebnisvariablen und druckt das Ergebnis in der Konsole. Beachten Sie, dass Sie das Ergebnis nicht in einer globalen Variablen speichern können. Hoffe, dass die Erklärung Ihnen helfen könnte.quelle