J'ai du mal à comprendre comment fonctionne async / await Je dois faire un programme qui contient trois fonctions: Ce code ne me donne que: Comment puis-je corriger cela? func1
func2
et concatenated .
func1
prend une chaîne comme argument et renvoie la même chaîne après 5 secondes de retard, func2
est une fonction async
qui prend également une chaîne comme un argument et renvoie la même chaîne. concaténée
est une fonction qui prend deux chaînes (s1, s2)
comme arguments et utilise les deux fonctions ci-dessus ( (func1 (s1) et func2 (s2))
) pour renvoyer leur résultat concaténé après 5 secondes. Donc, si nous passons ("bonjour", "monde")
à concaténé
, il devrait renvoyer bonjour le monde
. Mon code est: function func1(x) {
return new Promise(resolve => {
setTimeout(() => {
resolve(x);
}, 5000);
});
}
async function func2(x) {
const a = await func1(x);
return a;
}
function concatenated(a,b){
const c = func2(a).then(result =>{console.log(result)});
const d = func2(b).then(result =>{console.log(result)});
return (c+d) ;
}
concatenated("hello"," world")
bonjour
monde
3 Réponses :
Vous semblez mal comprendre les journaux de la console. Un console.log
régulier mettra toujours une nouvelle ligne, c'est pourquoi vous voyez hello world sur deux lignes plutôt qu'une. En supposant que vous utilisez Node.js, vous pouvez utiliser ce qui suit pour écrire dans la console sans nouvelle ligne pour obtenir le résultat souhaité:
process.stdout.write(result);
Le problème est que votre instruction de retour de la fonction concaténée
sera exécutée de manière synchrone . Cela signifie également que c
et d
seront toujours des promesses.
Une solution possible serait:
async function concatenated(a,b){ const c = await func2(a); const d = await func2(b); return (c+d); } concatenated("hello", " world").then(result => { console.log(result); // hello world })
Notez qu'une fonction asynchrone renverra toujours une promesse.
Vous pouvez obtenir le résultat après 5 secondes comme ceci:
function func1(x) { return new Promise(resolve => { setTimeout(() => { resolve(x); }, 5000); }); } async function func2(x) { const a = await func1(x); return a; } async function concatenated(a,b){ const [c,d] = await Promise.all([func2(a), func2(b)]) return c+d; } (async function main() { const ret = await concatenated("hello"," world") console.log(ret) })()
En utilisant la syntaxe JavaScript async / await
, vous pouvez écrire le code asynchrone comme le style synchrone. Pas besoin de promise.then
, pas besoin de rappel. C'est un peu différent des autres langues, par exemple Allez, Java
Pourquoi votre fonction
concaténée
n'utilise pasawait
, mais plutôtpuis
? Notez quec
etd
sont tous deux des promesses (pourundefined
, les résultats des rappels).