1
votes

javascript async / attendre et promettre

J'ai du mal à comprendre comment fonctionne async / await Je dois faire un programme qui contient trois fonctions: 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")

Ce code ne me donne que:
bonjour monde

Comment puis-je corriger cela?


1 commentaires

Pourquoi votre fonction concaténée n'utilise pas await , mais plutôt puis ? Notez que c et d sont tous deux des promesses (pour undefined , les résultats des rappels).


3 Réponses :


-2
votes

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);


0 commentaires

6
votes

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.


0 commentaires

1
votes

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


0 commentaires