J'essaie de générer une gamme de promesses de courir séquentiellement. J'ai vu beaucoup de conseils à ce sujet mais je ne peux pas le faire courir dans mon cas d'utilisation.
export default function generateIcons(){ return new Promise((resolve, reject) => { const containers = document.querySelectorAll('.html2CanvasTarget') const promises = containers.map(child => processIcon(child)) promises.reduce((p, fn) => p.then(fn), Promise.resolve()) resolve() }) } function processIcon(child){ return new Promise((resolve, reject) => html2canvas(child). then(canvas => uploadFromCanvas(canvas, child.childNodes[0].className.split(' ')[1] + '.png')) .then(resolve).catch(reject)) }
3 Réponses :
parce que Si possible, juste Await Code> Chaque appel de celui-ci dans un conteneurs code> est une nodelle, et les nodélistes n'ont pas de méthode code> .map code>, c'est pourquoi votre code lance une erreur.
processicon code> retourne déjà une promesse, il n'est pas nécessaire d'utiliser le constructeur de promesses à nouveau em>.
html2canvas code> renvoie déjà une promesse aussi, il n'y a donc pas besoin de constructeur de promesses nulle part (voir quelle est la promesse explicite construction antidiaptern et comment puis-je l'éviter? ) p>
pour code> boucle. Parce que
uploadfromCanvas code> renvoie également une promesse, et vous voulez l'attendre, renvoyez-le (ou
attendre code> it) également: p>
export default async function generateIcons() {
const containers = document.querySelectorAll('.html2CanvasTarget');
for (const container of containers) {
await processIcon(container);
}
}
function processIcon(child) {
return html2canvas(child, {backgroundColor:null})
.then(canvas => uploadFromCanvas(canvas, child.className.split(' ')[1] + '.png'))
.catch(console.log);
}
Selon votre question, vous pouvez utiliser Q Module Q pour cela
vous besoin de prendre un tableau vide et de pousser des promesses dedans et passez simplement ce tableau dans q méthode q ( q.allsettled code>), regardez un exemple avec un exemple P>
Promise.all(promiseHolder)
.then((results) => {
return results;
})
.catch((err) => {
console.log('Promise will reject here', err);
throw err;
});
On dirait que vous voulez résoudre la promesse principale lorsque les toiles sont disponibles pour tous les éléments de l'enfant. Vous pouvez utiliser Promise.All () a> pour cela. Il convient également de noter que le QuerySelectorall code> ne renvoie rien à ce que vous pouvez appeler le
.map code> sur. Vous devrez créer un tableau à partir de ce que le
QuerySelectorall code> renvoie - qui est un NODELIST . p>
Vous devez également ajouter .Catch () code> pour gérer tout rejet de promesse.
Pour les meilleures pratiques, vous devez le gérer globalement en ajoutant un crochet dans votre fichier principal ( sever.js code>). processus.on ("non anchants", (raison, promesse) => {console.log ("raison", raison); console.log ("promesse", promesse); // Envoyer mail si vous souhaitez notifier}); `