Je veux rompre conditionnellement une boucle comme celle-ci ..

for(let i = 0; i < 3; i++) {
 exampleFunction().then(result => {
    res = 0 ? i = 3 : null
 })
}

Je veux que exampleFunction s'exécute au moins 3 fois à moins qu'il n'obtienne le résultat souhaité, auquel cas je veux qu'il cesse de fonctionner.

0
Christopher Mellor 20 nov. 2018 à 22:58

4 réponses

Meilleure réponse

exampleFunction s'exécute de manière asynchrone. La seule façon de le faire fonctionner est d'utiliser async/await.

const iterateWithExampleFunction = async () => {
  for (let i = 0; i < 3; i++) {
    console.log('before', i)

    await exampleFunction().then(result => {
      i = result === 0 ? 3: i;
    });

    console.log('after', i)
  }
};

const exampleFunction = async () => {
  return 0;
}

iterateWithExampleFunction();
2
AnonymousSB 20 nov. 2018 à 22:21

J'espère que cela vous donne quelques idées

async function poll(f, threshold = 3) {
  if (!threshold) {
    throw new Error("Value not found within configured amount of retries");
  }
  const result = await f();
  if (result >= 0.5) {
    return result;
  } else {
    return await poll(f, threshold - 1);
  }
}

async function task() {
  return Math.random();
}

poll(task).then(console.log).catch(console.error);
0
Elias Toivanen 20 nov. 2018 à 20:19

Vous pouvez compter sur l'étendue externe, puis effectuer l'appel asynchrone.

let count = 0;

function executeCall() {
  exampleFunction().then(result => {
    // do something with the result
    if (result !== 0 && count !== 3) {
      count += 1;
      executeCall();
    }
  });
}
0
Sunny Wong 20 nov. 2018 à 20:06

Juste await le résultat, puis break:

(async function() {
  for(let i = 0; i < 3; i++) {
   const result =  await exampleFunction();
   if(result === 0) break;
  }
})();
0
Jonas Wilms 20 nov. 2018 à 20:13