Combinant les fonctions asynchrones, Await et setTimeout
Utilisant les dernières fonctionnalités asynchrones JavaScript, ce guide fournit une solution à un problème de performances courant : envoyer des requêtes excessives aux API Google dans un court laps de temps. L'objectif est d'introduire une fonction de veille pour retarder les requêtes et améliorer les performances des scripts.
Code original :
Ce code initial utilise efficacement le modèle async/wait :
async function asyncGenerator() { while (goOn) { var fileList = await listFiles(nextPageToken); var parents = await requestParents(fileList); } }
Problème :
Le code exécute la boucle while trop rapidement, ce qui entraîne un déluge de requêtes adressées à l'API Google.
Tentative de solution :
Pour résoudre ce problème, une fonction de mise en veille a été créée :
async function sleep(fn, par) { return await setTimeout(async function() { await fn(par); }, 3000, fn, par); }
Cependant, cette fonction ne parvient pas à renvoyer correctement la réponse à la demande.
Corriger Implémentation :
Le problème avec la fonction sleep réside dans l'absence de promesse renvoyée par setTimeout. Pour résoudre ce problème, une version promise peut être créée :
function timeout(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } async function sleep(fn, ...args) { await timeout(3000); return fn(...args); }
Boucle optimisée :
Pour ralentir l'exécution de la boucle, une fonction de veille qui met en pause tout le calcul n’est pas optimale. Une meilleure approche consiste à utiliser une construction Promise.all qui inclut la fonction sleep :
while (goOn) { var [parents] = await Promise.all([ listFiles(nextPageToken).then(requestParents), timeout(5000) ]); }
Cette modification garantit que le calcul des parents prend au moins 5 secondes, ralentissant efficacement la boucle et empêchant une API excessive. demandes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!