Mon code:
let AuthUser = data => {
return google.login(data.username, data.password).then(token => { return token } )
}
Et quand j'essaye d'exécuter quelque chose comme ça:
let userToken = AuthUser(data)
console.log(userToken)
Je suis en train:
Promise { <pending> }
Mais pourquoi?
Mon objectif principal est d'obtenir un jeton à partir google.login(data.username, data.password)
duquel retourne une promesse, dans une variable. Et alors seulement, effectuez certaines actions.
getFirstUser
fonctionRéponses:
La promesse sera toujours enregistrée en attente tant que ses résultats ne sont pas encore résolus. Vous devez faire appel
.then
à la promesse pour capturer les résultats quel que soit l'état de la promesse (résolu ou toujours en attente):Pourquoi donc?
Les promesses sont uniquement orientées vers l'avant; Vous ne pouvez les résoudre qu'une seule fois. La valeur résolue de a
Promise
est transmise à ses méthodes.then
ou.catch
.Détails
Selon les promesses / spécifications A +:
Cette spécification est un peu difficile à analyser, alors décomposons-la. La règle est:
Si la fonction dans le
.then
gestionnaire renvoie une valeur, alors laPromise
résolution avec cette valeur. Si le gestionnaire en renvoie un autrePromise
, l'original estPromise
résolu avec la valeur résolue de la chaînePromise
. Le.then
gestionnaire suivant contiendra toujours la valeur résolue de la promesse chaînée retournée dans le précédent.then
.La façon dont cela fonctionne réellement est décrite ci-dessous plus en détail:
1. Le retour de la
.then
fonction sera la valeur résolue de la promesse.2. Si la
.then
fonction renvoie aPromise
, la valeur résolue de cette promesse chaînée est transmise au suivant.then
.la source
Uncaught SyntaxError: Unexpected token .
. Le second a besoin d'un retour pourPromise
.then
sur une fonction non invoquée. a mis à jour la réponseJe sais que cette question a été posée il y a 2 ans, mais je rencontre le même problème et la réponse au problème est depuis ES6, que vous pouvez simplement
await
renvoyer la valeur des fonctions, comme:la source
.then(token => return token)
, c'est juste un passthrough inutile. Renvoyez simplement l'appel de connexion google.await
dehors d'une fonction asynchrone. Peut-être que le meilleur exemple ici serait de faire laAuthUser
fonctionasync
, qui se termine ensuite parreturn await google.login(...);
La
then
méthode retourne une promesse en attente qui peut être résolue de manière asynchrone par la valeur de retour d'un gestionnaire de résultats enregistré dans l'appel àthen
, ou rejetée en lançant une erreur dans le gestionnaire appelé.Ainsi, l'appel
AuthUser
ne connectera pas soudainement l'utilisateur de manière synchrone, mais retournera une promesse dont les gestionnaires alors enregistrés seront appelés après la réussite (ou l'échec) de la connexion. Je suggérerais de déclencher tout traitement de connexion par unethen
clause de la promesse de connexion. EG en utilisant des fonctions nommées pour mettre en évidence la séquence de flux:la source
Voir la section MDN sur les promesses. En particulier, regardez le type de retour de then ().
Pour se connecter, l'agent utilisateur doit soumettre une requête au serveur et attendre de recevoir une réponse. Étant donné que faire en sorte que votre application arrête totalement l'exécution pendant un aller-retour de demande entraîne généralement une mauvaise expérience utilisateur, pratiquement toutes les fonctions JS qui vous connectent (ou exécutent toute autre forme d'interaction avec le serveur) utiliseront une promesse, ou quelque chose de très similaire. , pour fournir des résultats de manière asynchrone.
Maintenant, notez également que les
return
instructions sont toujours évaluées dans le contexte de la fonction dans laquelle elles apparaissent. Ainsi, lorsque vous avez écrit:l'instruction
return token;
signifiait que la fonction anonyme transmisethen()
devait renvoyer le jeton, pas que laAuthUser
fonction le devrait. Ce quiAuthUser
revient est le résultat de l'appelgoogle.login(username, password).then(callback);
, qui se trouve être une promesse.En fin de compte, votre rappel
token => { return token; }
ne fait rien; au lieu de cela, votre entréethen()
doit être une fonction qui gère réellement le jeton d'une manière ou d'une autre.la source
return
est traitée la nouvelle syntaxe de fermeture (ish), auquel cas - eh bien, je désapprouve fortement cela, mais l'erreur est toujours la mienne et je m'en excuse.token => { return token; }
cela ne faisait rien au lieu de prétendre que c'était contre-productif. Vous pouvez diregoogle.login(username, password).then(token=>{return token;}).then(token=>{return token;})
et ainsi de suite pour toujours, mais vous n'obtiendrez le retour d'unPromise
qui se résout avec un jeton - comme si vous le laissiez commegoogle.login(username, password);
. Je ne sais pas pourquoi vous pensez que c'est "très faux".return token
ne fonctionne pas comme prévu par l'OP.promise.then(result => { return result; })
exactement équivalente àpromise
, donc l'appel de méthode ne fait rien et doit être abandonné pour simplifier le code et améliorer la lisibilité - une déclaration qui est tout à fait vraie.Votre promesse est en attente, complétez-la en
après votre code restant. Tout ce que fait ce code, c'est qu'il
.then()
complète votre promesse et capture le résultat final dans la variable de résultat et le résultat d'impression dans la console. Gardez à l'esprit que vous ne pouvez pas stocker le résultat dans une variable globale. J'espère que cette explication pourrait vous aider.la source