2
votes

Comment implémenter Promise.race () avec async / await

Comment puis-je implémenter la méthode Promise.race () avec async et await?

async function promiseRace(promises) {
  const results = [];
  for (const p of promises) {
    await p;
    results.push(p);
  }
  return results[0];
}

J'ai essayé de l'implémenter comme ci-dessus mais cela ne fonctionne pas.


5 commentaires

Quel problème spécifique vous rencontrez?


Bienvenue dans Stack Overflow. Pour améliorer cette question, montrez-nous ce que vous avez fait. Affichez le code source et décrivez ce qu'il fait et ce que vous devez faire. Voir Comment poser une bonne question et Comment créer un exemple minimal, complet et vérifiable


@CharlieWallace, je ne sais pas comment ce commentaire copier / coller s'applique à cette question. La question montre ce qu'ils ont fait et il y a du code source. Ils nous disent ce qu'il doit faire (Promise.race), et nous pouvons exécuter leur code et voir qu'il ne fonctionne pas. Alors pourquoi avez-vous posté ce commentaire?


@trincot, je cherche plus que "ça ne marche pas" dans la question. La question peut être améliorée en expliquant davantage quel est le comportement qui ne fonctionne pas.


La partie course ne fonctionne pas. Il a toujours été résolu / rejeté avec le premier paramètre donné à la fonction promiseRace: promiseRace (fisrtPromise, secondPromise). Même si secondPromise est résolu / rejeté plus rapidement, il renvoie toujours le résultat firstPromise.


4 Réponses :


4
votes

Vous ne pouvez pas. Lorsque vous utilisez wait , vous arrêtez l'exécution sur une promesse spécifique. Pour implémenter Promise.race manuellement, vous devez manipuler les rappels:

function race(promises) {
  return new Promise((resolve, reject) => {
     for(const promise of promises)
        promise.then(resolve, reject);
  });
}


0 commentaires

4
votes

Vous ne pouvez pas. Tout comme vous ne pouvez pas implémenter le constructeur Promise en utilisant async / await . N'oubliez pas que await n'est que du sucre syntaxique pour les appels puis - et vous ne pouvez pas implémenter les combinateurs de promesse de base en utilisant uniquement cela.


2 commentaires

Je ne comprends pas votre réponse. pourquoi c'est impossible? s'il s'agit de sucre synthétique, cela signifie qu'il y a plus de chemin à parcourir pour le faire. donc ça peut


Ce que je dis, c'est que vous ne pouvez pas implémenter Promise.race avec seulement .then () (sans new Promise ), et depuis wait n'est que du sucre syntaxique pour .then () (ne pas en faire plus), vous ne pouvez pas utiliser uniquement cela non plus.



-1
votes
function promiseRace(promises) {
  return new Promise((resolve, reject) => {
    promises.forEach(async (promise) => {
      try {
        const result = await promise;
        resolve(result);
      } catch (err) {
        reject(err);
      }
    });
  });

1 commentaires

Merci pour votre réponse. Pouvez-vous expliquer comment votre code fonctionne et pourquoi c'est une solution au problème?



-1
votes

Voici ma solution:

   async function promiseRace(promises) {
  const results = [];
  for (const p of promises) {
    results.push(await p);
  }
  return results[0];
}


0 commentaires