web-dev-qa-db-fra.com

Alors que les boucles utilisent Await Async.

Cette fonction Javascript semble utiliser la boucle while de manière asynchrone. Est-ce la bonne façon d'utiliser des boucles while avec des conditions asynchrones?

 var Boo;
 var Foo = await getBar(i)
 while(Foo) {
    Boo = await getBar3(i)
    if (Boo) {
      // something
    }
    Foo = await getBar(i)
    i++
  }

Ce que je pense qu'il fait est ceci:

var Boo;
var Foo;
getBar(i).then( (a) => {
  Foo = a;
  if(Foo) {
    getBar3(i).then( (a) => {
      Boo = a
      if(Boo) {
        //something
        i++;
        getBar(i).then( (a} => { Repeat itself...} 
      }
   }
  }
})

Si c'est totalement faux, pourriez-vous montrer une autre façon de le faire avec async wait and while loop?

Merci!!

9
Hcharlanes

Est-ce la bonne façon d'utiliser des boucles while avec des conditions asynchrones?

Oui. Les async functions suspendent simplement leur exécution à chaque await jusqu'à ce que les promesses respectées soient remplies, et toutes les structures de contrôle continuent à fonctionner comme auparavant.

11
Bergi

Cela fait longtemps que cette question a été posée. Je suis nouveau à js après de nombreuses années d’autres langues (à commencer par les cartes perforées et le ruban adhésif) et ai besoin de résoudre ce problème. Voici ma réponse:

var loopContinue = true;
var n = 0;

async function  Managework() {
  while (loopContinue) {  //seemingly an infinite loop
    //await (doWork(n));
    await (doWork(n).catch(() => { loopContinue=false; }));
    n++;
    console.log(`loop counter ${n}`);
  }
  console.log(`loop exit n=${n} loopContinue=${loopContinue}`);
 }

Managework();

function doWork(n) {
 return new Promise((resolve, reject) => {
    console.log(`dowork(${n})`);
    if (n > 5) {
      //loopContinue = false;
      reject(`done`);
    }
    setTimeout(() => {
      resolve('ok');
    }, 1000);
  });
}

Comme vous le souhaitez, la boucle se rompt après la 5ème itération. 'loopContinue' global peut être défini dans la fonction de travail ou dans la capture (ou peut-être à l'époque) de la promesse. Je me suis fatigué juste en utilisant 'pause' dans le puis ou attraper mais je reçois une erreur. 

Si vous voulez le faire dans doWork, vous pouvez éliminer le problème et simplement appeler doWork () et décommenter le // loopContinue = false dans doWork. De toute façon fonctionne. Cela a été testé avec node.js

J'ai trouvé des trucs sur nextTick mais cela semble beaucoup plus facile.

0
Charles Bisbee