0
votes

Confus sur les promesses et async-attendre

Je fais une application à l'aide de l'API GitHub et j'ai des problèmes avec des fonctions asynchrones. Je suis nouveau pour utiliser Async pour que j'apprécierais beaucoup l'aide. Voici le code que j'ai écrit jusqu'à présent: xxx

L'erreur que je reçois est un mot réservé inattendu à la ligne où j'ai utilisé attendre. Merci d'avance


3 commentaires

Bienvenue à! Vous ne pouvez pas utiliser attendre sauf si c'est directement à l'intérieur d'une fonction avec le mot-clé async . Changer fichiers => { à async fichiers => {. En outre, il est un peu étrange de faire laisser promettre un tableau 2D - il suffit d'attribuer le résultat de la carte directement à elle, sinon vous avez un tableau unique avec les promesses Array à l'intérieur de celui-ci.


Il y a beaucoup de problèmes avec votre code, en plus de celui désigné par GGORLEN Array.ProTotype.Push renvoie la la longueur de la matrice , ce qui n'est presque certainement pas ce que tu veux. Les valeurs de retour des fonctions ASYNC sont automatiquement enveloppées dans une promesse. La Fetch API revient déjà une promesse, pas besoin de en construire une manuelle là-bas non plus. Ce n'est pas clair pourquoi vous utilisez async / attendre lorsque vous en faites beaucoup de choses, ou pourquoi vous utilisez-vous lorsque vous utilisez ASYNC / Attendre. Vos en-têtes semblent être inutilisés. Vous Attribuez à un paramètre de fonction , etc., etc.


@gGorlen Merci de votre aide. Je ne sais pas pourquoi je faisais un tableau 2D. Je pense que je perds la tête. Quoi qu'il en soit réussi à la comprendre, Voici le code de travail .


4 Réponses :


0
votes

Alors je vais faire des hypothèses ici, alors corrigez-moi si je me trompe et je vais les réparer. Espérons-le, ce faisant, je peux aider à clarifier votre compréhension.

Un moyen facile de penser à async / attendre code> remplace le besoin de .Chen (Callback) code>. Je préfère utiliser attendre code> si dans une fonction async code>. P> xxx pré>

Ce code n'est pas testé. Je n'ai pas utilisé l'API de GitHub, donc je devine mieux ce que chaque appel fait. Si gh.getrepo code> ou repo.getContents code> ne retourne pas de promesses, alors un ajustement serait nécessaire. P>

Dans l'événement, la bibliothèque GitHub que vous utilisez sera ne pas renvoyer une promesse si un rappel n'est pas fourni: p> xxx pré>

Voici un exemple utilisant ASYNC / attendre qui utilise une nouvelle promesse d'acquisitionner un rappel: P>

P>

  content:
  <div id="content"></div>
  
  result:
  <div id="result"></div>


5 commentaires

Merci de votre aide, j'ai réussi à Figure la figure . Et juste pour clarifier non, l'API GITUB ne retourne pas des promesses, mais la dernière argument de la fonction est censée être un rappel.


@Kartiknair Sauf si vous utilisez une version très ancienne, je doute sincèrement que c'est le cas. Je suppose que si vous supprimez la fonction de rappel, il retournera une promesse.


@ggorlen je voulais en réalité en prendre note de cela. Sans savoir combien de fichiers reviennent, j'ai pris le chemin le plus conservateur avec cet exemple. J'étais également principalement concentré sur la tentative d'illustrer la façon dont ASYNC / AWAIT fonctionne. Cela dit, vous avez raison. Ceci est différent de ce que OP a initialement écrit. Je mettrai à jour le code pour être plus conforme à ce qu'il a présenté.


@Kartiknair j'ai mis à jour ma réponse pour être plus en ligne avec ce que vous avez initialement eu. J'ai ajouté une solution dans le cas où une promesse n'est pas retournée lorsqu'un rappel est omis (encore une fois, je doute que).


Merci @Chance, vous aviez complètement raison. Ma faute. Merci pour les informations, je l'utiliserai en combinaison avec la réponse acceptée pour faire ma fonction.



0
votes

Je pensais que ceci est le code révisé: xxx

Je ne sais toujours pas si c'est le moyen "droit" de le faire, mais ça marche. < / p>


0 commentaires

0
votes

Le mot clé code> ne peut être utilisé qu'avec une fonction async code>. Si vous remarquez que votre attend votre promesse.Tous (Promises.map (Promess => RetFiles.Push (promess))); Code> est à l'intérieur d'une fonction qui passe Fichiers code> param .Chen code>. Il suffit de faire cette fonction async code> et attendre code> fonctionnera dans la portée. Essayez le code ci-dessous.

 const getFiles = async function(token, reponame) {
  var gh = new GitHub({
    token: token
  });

  reponame = reponame.split("/");
  const repo = gh.getRepo(reponame[0], reponame[1]);

  let head = new Headers();
  head.append("Authorization: ", "token " + token);

  const getContents = new Promise((res, rej) => {
    repo.getContents(null, "content", true, (err, files) => {
      if (err) rej(err);
      else return files;
    }).then( async (files) => {
      let promises = [
        files.map(
          file =>
            new Promise(res => {
              fetch(file.downloadURL).then(body => {
                res(body.text);
              });
            })
        )
      ];

      const retFiles = [];
      await Promise.all(promises.map(promise => retFiles.push(promise)));
      res(retFiles)
    });
  });

  return getContents;
};


0 commentaires

0
votes

Il y a beaucoup de problèmes ici. Le code est très compliqué; Il n'y a pas besoin de toutes ces promesses et de ces couches d'indirection et de nidification pour atteindre ce dont vous avez besoin.

Le modèle que vous essayez de faire est très commun: p>

  • Faites une demande d'obtenir une liste d'entités (fichiers, utilisateurs, URL ...). LI>
  • Pour chaque entité renvoyée dans cette liste, faites une autre demande pour obtenir plus d'informations pour cela. Li>
  • renvoie le résultat comme une promesse (il doit s'agir d'une promesse, car async code> Les fonctions ne peuvent renvoyer que des promesses). LI> ul>

    Le moyen de faire cela est de briser le problème en étapes. Utilisez le attendre code> et async code> Mots-clés au lieu de .Chen code> dans la plupart des cas. Pour rendre l'exemple reproductible, je vais utiliser un scénario sur lequel nous souhaitons obtenir des profils d'utilisateurs pour le plus récent Les gisières code> créés sur github - c'est fondamentalement équivalent à ce que vous faites et je ' ll laisse à vous d'extrapoler. p>

    La première étape consiste à obtenir la liste initiale d'entités (gisières récemment créées): p> xxx pré>

    Suivant, car Chaque gist dans notre éventail de gisières de 0..n code>, nous devons tirer une demande. Il est important de nous assurer que nous ne séralisons rien ici en utilisant attendre code>: p> xxx pré>

    maintenant que toutes les demandes sont en vol, nous devons attendre ils complètent. C'est là que promess.all code> est disponible: p> xxx pré>

    dernière étape consiste à obtenir le JSON de chaque réponse, ce qui nécessite une autre promesse . Tous CODE>: P>

    const getRecentGistCreators = async (n=1) => {
      try {
        const res = await fetch("https://api.github.com/gists/public");
        const gists = await res.json();
        const requests = gists.slice(0, n).map(gist =>
          fetch(`https://api.github.com/users/${gist.owner.login}`)
        );
        const responses = await Promise.all(requests);
        return await Promise.all(responses.map(e => e.json()));
      }
      catch (err) {
        throw err;
      }
    };
    
    (async () => {
      try {
        for (const user of await getRecentGistCreators(5)) {
          const elem = document.createElement("div");
          elem.textContent = user.name;
          document.body.appendChild(elem);
        }
      }
      catch (err) {
        throw err;
      }
    })();


1 commentaires

Merci je suivrai vos instructions!