La promesse sera toujours vous connecter en attendant, tant que ses résultats ne sont pas encore résolue. Indépendamment de la promesse de l'état (résolus ou encore dans l'attente de), vous devez appeler .then
sur la promesse de capturer les résultats:
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) //will log results.
})
pourquoi est-ce?
Les promesses sont vers l'avant seulement, vous ne pouvez les résoudre une fois, et vous ne pouvez obtenir à leur valeur de transmettre à leurs .then
ou .catch
méthodes
Détails
Selon les Promesses/A+ caractéristiques:
La promesse de la procédure de résolution est un résumé de l'opération en prenant comme
entrée d'une promesse et d'une valeur, que nous noterons [[Résoudre]](promesse,
x). Si x est un thenable, il tente de rendre la promesse d'adopter l'état de
x, sous l'hypothèse que x se comporte un peu comme un
promesse. Sinon, il remplit la promesse avec la valeur x.
Ce traitement de thenables permet promesse des implémentations
interagir, tant qu'ils exposent une des Promesses/A+-compatible alors
la méthode. Il permet aussi de Promesses/A+ implémentations "assimiler"
nonconformant implémentations raisonnablement puis des méthodes.
Cette spécification est un peu difficile à analyser, donc permet de le décomposer:
La règle est que, si la fonction dans l' .then
gestionnaire retourne une valeur, l' Promise
résout à cette valeur. Si la fonction renvoie un Promise
, l'autre, alors la clause sera l' .then
de l'état résolu de le retourné Promise
. La façon dont il fonctionne réellement est décrite en détail ci-dessous:
1. Le retour de l' .then
fonction sera la détermination de la valeur de la promesse.
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. Si l' .then
fonction renvoie une promesse, puis la volonté de ses promesse sera la volonté de ses prochaines .then
de coeur.
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"
});
2 votes
@LoïcFaure-Lacroix , voir cet article : medium.com/@bluepnume/
0 votes
@LoïcFaure-Lacroix regarder à
getFirstUser
fonction0 votes
Alors, qu'en est-il ? C'est une fonction qui renvoie une promesse.
1 votes
@LoïcFaure-Lacroix donc vous voulez dire que même dans cet exemple nous devons utiliser then pour accéder à la promesse de données retournée dans la fonction getFirstUser ?
0 votes
Dans cet exemple oui, le seul autre moyen est d'utiliser la syntaxe ES7 "await" qui semble résoudre l'arrêt de l'exécution du contexte actuel pour attendre le résultat de la promesse. Si vous lisez l'article, vous le verrez. Mais comme ES7 n'est probablement supporté nulle part encore, oui. Le "then" est à peu près tout.
0 votes
@LoïcFaure-Lacroix Merci. Je connais await, mais comme je veux exécuter script sans babel, j'ai décidé d'utiliser Promises pour éviter l'enfer du callback. Mais il me semble que je suis proche de 'then hell' :D ... donc, il y a 0 moyen d'utiliser les promesses et de récupérer le résultat d'une promesse dans une variable et seulement ensuite continuer l'exécution ?
0 votes
Non, il n'y a aucun moyen, pour autant que je sache, car le code est exécuté dans un contexte différent.
0 votes
Techniquement, même avec
await
il ne suspend l'exécution qu'à l'intérieur d'une fonction (style co-routine). Vous ne pouvez pas attendre en dehors d'une fonction et la fonction dans laquelle vous attendez doit être marquée commeasync
et cette fonction renverra une promesse à la place. En fin de compte, vous ne pouvez pas échapper à l'utilisation de callbacks lorsque vous traitez du code asynchrone.0 votes
@slebetman async/await permet de récupérer la valeur de retour d'une promesse et de la placer dans la variable. C'est ainsi que l'on échappe au callback.
0 votes
@Src : Oui, mais seulement à l'intérieur de la fonction asynchrone. Si vous avez besoin de la valeur dans la boucle principale de votre programme, vous devez toujours passer un callback à la promesse que la fonction async renvoie.