Warum ist mein asynchrone Funktion Rückkehr Versprechen { <pending> } anstatt den Wert?
Mein code:
let AuthUser = data => {
return google.login(data.username, data.password).then(token => { return token } )
}
Und wenn ich versuche zu laufen so etwas wie dieses:
let userToken = AuthUser(data)
console.log(userToken)
Ich bin immer:
Promise { <pending> }
Aber warum?
Mein Ziel ist es token von google.login(data.username, data.password)
gibt ein Versprechen, in eine variable. Und nur dann preform einige Aktionen.
Es ist ein Versprechen. Das Versprechen ist nicht gestartet, unmittelbar nachdem es erstellt wurde. Das ist, warum es heißt ein Versprechen. Sie Versprechen, etwas zu tun, später.
siehe auch diesen Artikel: medium.com/@bluepnume/...
Blick auf
Also was ist es? Es ist eine Funktion, die Rückkehr ein Versprechen.
also du meinst auch in diesem Beispiel müssen wir nutzen, um auf die Daten zuzugreifen Versprechen der Rückkehr in getFirstUser Funktion?
siehe auch diesen Artikel: medium.com/@bluepnume/...
Blick auf
getFirstUser
FunktionAlso was ist es? Es ist eine Funktion, die Rückkehr ein Versprechen.
also du meinst auch in diesem Beispiel müssen wir nutzen, um auf die Daten zuzugreifen Versprechen der Rückkehr in getFirstUser Funktion?
InformationsquelleAutor Src | 2016-08-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das Versprechen wird immer Protokoll ausstehend, solange Ihre Ergebnisse sind noch nicht behoben. Unabhängig von der promise-Zustand (gelöst oder noch ausstehende) rufen Sie
.then
auf das Versprechen, die Erfassung der Ergebnisse:Warum ist das so?
Versprechen in vorwärts-Richtung nur; Sie können nur lösen Sie Sie einmal. Der aufgelöste Wert einer
Promise
übergeben wird, um seine.then
oder.catch
Methoden.Details
Entsprechend der Promises/A+ - Spezifikation:
Diese Skillung ist ein wenig schwer zu analysieren, so lassen Sie uns es brechen. Die Regel ist:
Wenn die Funktion in der
.then
- handler einen Wert zurückgibt, derPromise
löst sich mit diesem Wert. Wenn der hf ein weitererPromise
originalPromise
löst sich mit der aufgelösten Wert der verkettetenPromise
. Die nächste.then
handler enthält immer den aufgelösten Wert der verketteten Versprechen wieder in den vorhergehenden.then
.Dem, wie es tatsächlich funktioniert, ist im folgenden ausführlich beschrieben:
1. Die Rückkehr der
.then
Funktion wird der gelöste Wert der Versprechen.2. Wenn die
.then
- Funktion gibt einePromise
, dann mit der aufgelösten Wert das Versprechen gekettet ist an die folgenden.then
.Uncaught SyntaxError: Unexpected token .
. Die zweite braucht man eine Gegenleistung fürPromise
Sie müssen zum aufrufen der Funktion, wie im zweiten Beispiel. Sie kann
.then
auf eine uninvoked Funktion. aktualisiert die AntwortInformationsquelleAutor Bamieh
Ich weiß, diese Frage wurde vor 2 Jahren aber hatte ich das gleiche Problem und die Antwort für das problem ist seit ES6, dass Sie einfach
await
die Funktionen return-Wert, wie:.then(token => return token)
, das ist nur eine unnötige passthrough. Einfach wieder die google-login aufrufen.InformationsquelleAutor Marius Seack
Den
then
Methode gibt ein ausstehendes Versprechen, die gelöst werden können, die asynchron durch den return-Wert einer Ergebnis-handler registriert, die im Aufrufthen
oder abgelehnt durch auslösen eines Fehlers innerhalb der handler aufgerufen.So aufrufen
AuthUser
wird nicht plötzlich melden sich die Benutzer in synchron, sondern gibt ein Versprechen, dessen dann registrierte Handler werden aufgerufen, nachdem die Anmeldung erfolgreich ist ( oder ausfällt). Ich würde vorschlagen, Auslösung alle login-Verarbeitung durch einethen
- Klausel der login-Versprechen. E. G. mit benannten Funktionen zu markieren, die Reihenfolge der flow:InformationsquelleAutor traktor53
Finden Sie in der MDN-Abschnitt auf Verspricht. insbesondere, Blick auf die return-Typ von dann().
Anmelden, den user-agent zu senden Sie eine Anfrage an den server und warten, um eine Antwort zu erhalten. Seit Sie Ihre Anwendung ganz beenden während der Ausführung einer Anfrage-round-trip-in der Regel macht für eine schlechte user-Erfahrung, praktisch jede JS-Funktion, die logs, die Sie in (oder führt jede andere form von server-Interaktion) wird mit einem Versprechen, oder etwas sehr viel wie Sie, um Ergebnisse zu liefern asynchron.
Nun auch feststellen, dass
return
Aussagen werden immer ausgewertet, die im Kontext der Funktion, die Sie in angezeigt werden. Also, wenn Sie schrieb:die Aussage
return token;
bedeutete, dass die anonyme Funktion übergeben wird, inthen()
sollte den token, nicht, dass dieAuthUser
Funktion sollte. WasAuthUser
zurückgibt, ist das Ergebnis des Aufrufsgoogle.login(username, password).then(callback);
, was ein Versprechen.Letztendlich auf Ihren Rückruf
token => { return token; }
tut nichts; statt dessen wird Ihre Eingabe zuthen()
muss eine Funktion sein, die tatsächlich behandelt das token in irgendeiner Weise.Alle Rechte, auch tun wird. Ich nehme an, das problem ist, dass ich falsch verstanden habe, wie
return
behandelt wird, mit der neuen(ish) Verschluss syntax, in dem Fall-naja, ich stark ablehnen, aber der Fehler ist immer noch meins und ich möchte mich dafür entschuldigen.Äh, ich habe tatsächlich erfahren, dass ein Teil, das ist der Grund, warum ich behauptete, dass
token => { return token; }
nichts im Gegensatz zu behaupten, dass es kontraproduktiv war. Man kann sagengoogle.login(username, password).then(token=>{return token;}).then(token=>{return token;})
und so weiter, für immer, aber du wirst nur erreichen, wenn die Rückkehr einPromise
dass löst sich mit einem token—identisch, wenn Sie verlassen es alsgoogle.login(username, password);
. Ich bin mir nicht sicher, warum Sie der Meinung sind, dass dies "sehr falsch".können Sie etwas konkreter über das, was ist falsch in diesem text? Ich sehe nichts, er hat nur erklärt, warum
return token
funktioniert nicht, da die OP wahrscheinlich erwartet.es ist in der Tat ein Missverständnis. Wir alle drei kennen sich gut, wie Sie verspricht Arbeit, die Aussage ist, dass
promise.then(result => { return result; })
entspricht genaupromise
daher dem Aufruf der Methode nichts und sollten gelöscht werden um den code vereinfachen und verbessern die Lesbarkeit - ein statement, das ist völlig richtig.InformationsquelleAutor Jesse Amano