J'essaie d'utiliser les nouvelles fonctionnalités asynchrones et j'espère que la résolution de mon problème aidera les autres à l'avenir. Voici mon code qui fonctionne:
async function asyncGenerator() {
// other code
while (goOn) {
// other code
var fileList = await listFiles(nextPageToken);
var parents = await requestParents(fileList);
// other code
}
// other code
}
function listFiles(token) {
return gapi.client.drive.files.list({
'maxResults': sizeResults,
'pageToken': token,
'q': query
});
}
Le problème est que ma boucle while s'exécute trop rapidement et que le script envoie trop de requêtes par seconde à l'API Google. Par conséquent, je voudrais créer une fonction de veille qui retarde la demande. Ainsi, je pourrais également utiliser cette fonction pour retarder d'autres requêtes. S'il existe un autre moyen de retarder la demande, veuillez m'en informer.
Quoi qu'il en soit, c'est mon nouveau code qui ne fonctionne pas. La réponse de la demande est renvoyée à la fonction asynchrone anonyme dans le setTimeout, mais je ne sais pas comment je peux retourner la réponse à la fonction sleep resp. à la fonction asyncGenerator initiale.
async function asyncGenerator() {
// other code
while (goOn) {
// other code
var fileList = await sleep(listFiles, nextPageToken);
var parents = await requestParents(fileList);
// other code
}
// other code
}
function listFiles(token) {
return gapi.client.drive.files.list({
'maxResults': sizeResults,
'pageToken': token,
'q': query
});
}
async function sleep(fn, par) {
return await setTimeout(async function() {
await fn(par);
}, 3000, fn, par);
}
J'ai déjà essayé quelques options: stockage de la réponse dans une variable globale et retour de la fonction sleep, rappel dans la fonction anonyme, etc.
la source
Promise.all
approche. Si simple et élégant!var [parents]
représente la notation de ? Je ne l'ai jamais vu auparavant et c'est une chose difficile à googleasync function
.async
/await
est basé sur des promesses. La seule chose qu'il remplace, ce sont lesthen
appels.Depuis Node 7.6 , vous pouvez combiner la fonction de
promisify
fonctions du module utils avecsetTimeout()
.Node.js
Javascript
Usage
la source
await require('util').promisify(setTimeout)(3000)
peut également être réalisé sans nécessiter par:await setTimeout[Object.getOwnPropertySymbols(setTimeout)[0]](3000)
getOwnPropertySymbols
version ... si elle n'est pas cassée ...!La doublure rapide, en ligne
la source
let sleep = ms => new Promise( r => setTimeout(r, ms));
// une fonction de doublureawait new Promise(resolve => setTimeout(resolve, 5000))
setTimeout
n'est pas uneasync
fonction, vous ne pouvez donc pas l'utiliser avec ES7 async-wait. Mais vous pouvez implémenter votresleep
fonction en utilisant ES6 Promise :Ensuite, vous pourrez utiliser cette nouvelle
sleep
fonction avec ES7 async-wait:Veuillez noter que je ne réponds qu'à votre question sur la combinaison async / ES7 avec ES7
setTimeout
, bien que cela ne puisse pas résoudre votre problème avec l'envoi de trop de demandes par seconde.Mise à jour: les versions modernes de node.js ont une implémentation de délai d'attente asynchrone intégrée , accessible via l' aide util.promisify :
la source
fn
lancez l'erreur, vous ne serez pas pris.new Promise
endroit où vous le pouvezsleep.catch
.setTimeout
rappel asynchrone et lenew Promise
rappel est fait depuis longtemps. Il bouillonnera dans le contexte mondial et sera levé comme une exception non gérée.Si vous souhaitez utiliser le même type de syntaxe que
setTimeout
vous pouvez écrire une fonction d'aide comme celle-ci:Vous pouvez alors l'appeler ainsi:
J'ai fait un résumé: https://gist.github.com/DaveBitter/f44889a2a52ad16b6a5129c39444bb57
la source
delayRun
aurait plus de sens ici, car il retardera l'exécution de la fonction de rappel de X secondes. Pas un exemple très attendu, OMI.la source
Le code suivant fonctionne dans Chrome et Firefox et peut-être dans d'autres navigateurs.
Mais dans Internet Explorer, j'obtiens une erreur de syntaxe pour le
"(resolve **=>** setTimeout..."
la source
Faites un utilitaire inspiré de la réponse de Dave
Fondamentalement passé dans un
done
rappel à appeler lorsque l'opération est terminée.Voici comment je l'utilise:
la source
Ceci est ma version avec nodejs maintenant en 2020 dans AWS labdas
la source
Il s'agit d'une solution plus rapide dans une doublure.
J'espère que cela vous aidera.
la source
await setTimeout(()=>{console.log('first')}, 200); console.log ('second')
imprime en deuxième puis en premiervar test = async () => { await setTimeout(()=>{console.log('first')}, 1000); console.log ('second') }
J'ai prolongé le délai d'expiration pour montrer son utilité.