J'ai une boucle for qui parcourt les fonctions et je veux que cette boucle attende que la fonction soit terminée pour passer à la fonction suivante. Comment faire?
middlewares = []
for (let i in middlewares) {
middlewares[i]()
}
3 Réponses :
Vous ne pouvez pas car for les boucles sont synchrones. Je recommande d'utiliser async pour cela.
Vous pouvez rendre les fonctions middlewares asynchrones. Cela permet d'attendre plus facilement la fin de la fonction, puis de passer à la suivante. Créer une fonction asynchrone est simple: fonction async (...) {...} . Découvrez-les ici .
La solution suivante fonctionnera si les fonctions middlewares renvoient une promesse lorsqu'elles sont asynchrones
async function loop(middlewares) {
for (let fn of middlewares) {
await fn();
}
}
loop(middlewares)
.then(() => console.log("finished");
Vous n'avez même pas besoin de l'envelopper dans Promise.resolve () . await le fait implicitement pour vous. Vous pouvez simplement attendre fn () . "Si la valeur de l'expression qui suit l'opérateur d'attente n'est pas une promesse, elle est convertie en une promesse résolue." - MDN await
les fonctions middlewares sont-elles asynchrones ou synchrones?
si
middlewares [i]est une fonction synchrone, donc votre code fait exactement ce que vous voulez qu'il fasse. S'il est asynchrone, lisez ici comment faire manipulez-le.Nous aurons besoin de plus d'exemple. Ce code ne fait rien. S'ils sont asynchrones, vous pouvez les enchaîner avec des promesses.
Les fonctions middlewares peuvent être synchrones et asynchrones.