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: L'erreur que je reçois est un mot réservé inattendu à la ligne où j'ai utilisé attendre. Merci d'avance p> p>
4 Réponses :
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 à 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 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> Voici un exemple utilisant ASYNC / attendre qui utilise une nouvelle promesse d'acquisitionner un rappel: P> P> async / attendre code> remplace le besoin de
.Chen (Callback) code>. Je préfère utiliser
attendre code> si dans une fonction
async code>. P>
gh.getrepo code> ou
repo.getContents code> ne retourne pas de promesses, alors un ajustement serait nécessaire. P>
content:
<div id="content"></div>
result:
<div id="result"></div>
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.
Je pensais que ceci est le code révisé: Je ne sais toujours pas si c'est le moyen "droit" de le faire, mais ça marche. P> < / p>
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;
};
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>
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;
}
})();
Merci je suivrai vos instructions!
Bienvenue à! Vous ne pouvez pas utiliser
attendre code> sauf si c'est directement à l'intérieur d'une fonction avec le mot-clé code> async code>. Changer
fichiers => { code> à
async fichiers => { code>. En outre, il est un peu étrange de faire
laisser promettre code> un tableau 2D - il suffit d'attribuer le résultat de la carte code> 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 code> renvoie la la longueur de la matrice i>, 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 I> 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 i>, 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 .