Je travaille pour en savoir plus sur les promesses JavaScript et j'ai rencontré un problème en essayant de combiner une logique de promesse à partir de fonctions séparées en une seule fonction en ligne. Quand j'ai tout rassemblé dans une seule fonction en ligne, il en résulte un résultat «indéfini» pour le résultat de retour des promesses au lieu de la valeur «monde» prévue.
[FONCTIONNE comme prévu, où il résout la promesse de manière asynchrone, et aboutit à "monde" pour la réponse de promesse]
var helloResult = async () => { await new Promise(r => { setTimeout(r, 3000); return 'world'; }) .then((responseData)=> { console.log('COMPLETED Promise Result (Promise completed): ' + responseData) })};
[NE FONCTIONNE PAS - Résultats "non défini" au lieu de "monde" pour la réponse de promesse ...]
XXX
[NE FONCTIONNE PAS - Résultats "non définis" au lieu de "monde" pour la réponse de promesse ...]
var helloResult = async (r) => { await new Promise(r => { setTimeout(r, 3000); return 'world'; }) }; let helloResponse = helloResult().then((res)=> { console.log('COMPLETED Promise Result (Promise completed): ' + res) })
Pour une raison quelconque la promesse dans les 2 secondes tentatives de changer le code se traduit par «undefined» au lieu de la valeur attendue du résultat de retour de «world».
Tout conseil est apprécié, merci pour votre aide.
5 Réponses :
Vous revenez du rappel du constructeur Promise
dans vos derniers exemples. Cette valeur n'est pas résolue. Vous devez appeler le rappel résoudre
pour transmettre la valeur.
await new Promise(r => { setTimeout(() => r('world'), 3000); });
Excellent! Merci @Daniel, je l'apprécie vraiment, c'est exactement ce qui me manquait.
Vous devriez être en mesure de résoudre ce problème en utilisant une résolution
dans votre promesse, comme ceci:
var helloResult = async (r) => { await new Promise(r => { setTimeout(r, 3000); resolve('world'); }) }; let helloResponse = helloResult().then((res)=> { console.log('COMPLETED Promise Result (Promise completed): ' + res) })
De même, cela peut être fait pour votre deuxième bloc de code où vous avez enchaîné un puis
sur la promesse.
Non, une promesse attendra que toutes les actions invoquées soient terminées avant d'être résolue.
Je ne pense pas que ce soit juste. Ce code ne fonctionne pas non plus
Vous n'avez pas de return
dans helloResult ()
et devez passer l'argument à resolve()
var helloResult = async(r) => { return await new Promise(r => { setTimeout(r, 500, 'world'); }) }; let helloResponse = helloResult().then((res) => { console.log('COMPLETED Promise Result (Promise completed): ' + res) })
Je vois la confusion.
var helloResult = async (r) => await new Promise(r => { setTimeout(r, 3000, 'world'); }); // or var helloResult = async (r) => await new Promise(r => { setTimeout(()=> r('world'), 3000); });
Dans le constructeur de promesse, vous pouvez renvoyer une valeur mais elle est ignorée. La valeur transmise le long de la chaîne est celle qui est transmise aux fonctions résoudre
ou rejet
. Alors quand vous faites:
var helloResult = async (r) => { await new Promise(r => { setTimeout(r, 3000); return 'world'; }) };
C'est le même concept. setTimeout
appelle resolution
( r
) au bon moment mais ne transmet pas la valeur ('world'). Dans votre cas, vous avez 2 options qui font toutes deux essentiellement la même chose:
new Promise((resolve, reject) => { resolve(1); return 2; }).then(v => console.assert(v===1))
À partir de votre deuxième exemple: puis
est une méthode sur l'API Promise, vous devez donc renvoyer une promesse de helloResult
pour que cela ait un effet. Vous ne résolvez pas non plus cette promesse une fois le délai écoulé.
var helloResult = () => { return new Promise(resolve => { setTimeout(() => resolve('world'), 3000); }); }; (async () => { const response = await helloResult(); console.log(`COMPLETED Promise Result (Promise completed): ${response}`); })();
Alternativement, si vous souhaitez utiliser async / await
, vous pouvez, mais vous devez vous assurer que le code contenant le await
se trouve avec un async
.
var helloResult = () => { return new Promise(resolve => { setTimeout(() => resolve('world'), 3000); }); }; let helloResponse = helloResult().then((res) => { console.log('COMPLETED Promise Result (Promise completed): ' + res) })
async
doit être dans le rappelget
en premier lieu (async (request, response) => {
), si vous prévoyez de maintenez la valeur de la réponse de promesse surhelloResult
. Emballer les choses à l'intérieur dansasync
ne fera aucune magie tant que le rappel parent n'est pas marquéasync
.