105 votes

Comment puis-je attendre un ensemble de fonctions de rappel asynchrones ?

J'ai du code qui ressemble à ceci en javascript:

forloop {
    //appel asynchrone, renvoie un tableau à son rappel
}

Après que TOUS ces appels asynchrones soient terminés, je veux calculer le minimum sur tous les tableaux.

Comment puis-je attendre qu'ils soient tous terminés?

Ma seule idée en ce moment est d'avoir un tableau de booléens appelés done, et de définir done[i] à true dans la fonction de rappel ith, puis dire tant que (pas tous terminés) {}

éditer: Je suppose qu'une solution possible, mais laide, serait de modifier le tableau done dans chaque rappel, puis appeler une méthode si tous les autres done sont définis à partir de chaque rappel, donc le dernier rappel à terminer appellera la méthode de continuation.

1voto

Raynos Points 82706

Utilisez une bibliothèque de flux de contrôle comme after

after.map(array, function (value, done) {
    // faire quelque chose de façon asynchrone
    setTimeout(function () {
        // faire quelque chose avec la valeur
        done(null, value * 2)
    }, 10)
}, function (err, mappedArray) {
    // tout est fait, continuer ici
    console.log(mappedArray)
})

1voto

Didier68 Points 463

Je vois plusieurs réponses avec Promise.all(), mais cette fonction s'arrête si une promesse génère une exception...

La meilleure solution en 2022 est Promise.allSettled() (documentation ici: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/allSettled

Un exemple rapide:

const allPromises = [];
for (r in records) {
  const promise = update_async(r);
  allPromises.push(promise);
};
await Promise.allSettled(allPromises);

À la fin, vous obtenez avec allPromises un tableau avec le résultat de chaque promesse:

  • quand c'est ok --> {status: “fulfilled”, value: xxx }
  • quand il y a une erreur --> {status: "rejected", reason: Error: an error}

0voto

Zhao Hong Points 101

En Node.js, vous pouvez utiliser async/await pour contrôler le flux asynchrone

  • async/await est supporté dans Node.js 7.6
  • la fonction util pour transformer un callback en promesse est supportée dans Node.js v8

Code d'exemple:

const foo = async () => {
  try {
    const ids = [100, 101, 102];
    const fetchFromExternalApi = util.promisify(fetchFromExternalApiCallback);
    const promises = ids.map((id) => fetchFromExternalApi(id));
    const dataList = await Promise.resolve(promises); // dataList est un tableau
    return dataList;
  } catch (err) {
    // gestion des erreurs
  }
};

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X