J'ai une fonction asynchrone que je veux avoir un délai de 5 000 ms avant d'être tiré. J'essaie d'utiliser Problème: forte > La fonction ASYNC est déclenchée instantanément sans délai (impression de la console 5 Code JavaScript FORT> P> Settimeout () code> pour y parvenir. Cette fonction asynche se produit dans une boucle qui fonctionne plusieurs fois, la fonction ASYNC étant passée de différentes données à chaque fois, ainsi seinterval () code> ne peut pas être utilisé ici. effectué instantanément code> instantanément »et boucles sans retard. Qu'est-ce qui est arrivé, et comment puis-je le résoudre? P> someFunction(listings, function() {
for (var i in listings ) {
var listing = listings[i];
setTimeout(asyncFunction(listing, function(data) {
console.log('Done');
}), 5000);
}
});
4 Réponses :
Vous devez envelopper la fonction dans une autre fonction. Actuellement, vous appelez la fonction et transmettez la valeur de retour sous forme d'argument sur Je devais ajouter Settimeout code>. Le code ci-dessous transmettra (correctement) une fonction à Settimeout code>. Au bout de 5 secondes, la fonction s'exécute. code>. P>
Cela déclenchera toujours n délais d'attente presque parallèles.
Merci pour la réponse! Il existe un délai initial de 5000 ms, mais les appels ultérieurs à l'asyncconftion se produisent instantanément! Les appels ultérieurs aux fonctions peuvent-ils retarder de sorte que chaque appel soit de 5 000 ms?
Il possède également le problème de la boucle / portée classique (la variable "listing")
J'ai remarqué que toutes les fonctions ASYNC obtiennent la même liste code> la variable code> comme signalée pointue
Réponse mise à jour pour ajouter un délai de 5 secondes entre chaque appel. @Poindy que le problème de la portée a déjà été adressé dans mon Ninja-edit lors de la première révision.
@jandy Maintenant, les fonctions sont déclenchées avec un délai de 5 secondes entre les deux.
@ROBW génial, a résolu plusieurs problèmes ici! Je ne comprends pas comment fonctionne la fonction de fermeture: fonction (listes) {...} (listes) code> Pourquoi existe-t-il un supplémentaire code> ajouté à la fin de la fonction? N'ont jamais vu cela avant ...
@Nyxynnyx Normalement, vous invoquez une fonction par func_name (paramètre) code>. Au lieu de définir une fonction nommée, vous pouvez également créer et invoquer une fonction anonyme: (fonction (argument) {...}) (paramètre) code>. En passant listing code> à la fonction anonyme, la variable code> code> à l'intérieur de la fonction anonyme ne changera pas lorsque la variable code> lister code> dans le corps de la boucle est mise à jour à nouveau .
C'est la différence.Le point clé est ce qui est asyncfunction code> faire? Pouvez-vous le coller?
Le premier "Settimeout ()" est incorrect, car il sera immédiatement invoquer "foo ()" et passez son résultat i> à "Settimeout ()". La seconde, passant une chaîne, est généralement considérée comme obsolète.
Oui, la chaîne de passage sera eval code> et ensuite l'exécuter sur la portée globale. Très mauvaise idée
Ne sachant pas ce que votre asynccunction code> fait, il semblerait qu'il pouvait simplement renvoyer la fonction que vous avez transmise. function asyncFunction( lstng, func ) {
return function() {
// do some stuff with the listing
// then invoke the func
func();
}
}
Merci, réduit une ligne de code en utilisant i code> au lieu de compteur code>. Asynccfunction utilise 2 valeurs de rappel dans DATA CODE> et les envoie à un autre serveur.
@Nyxynnyx: Pas tout à fait sûr de ce que vous voulez dire, mais vous pouvez passer tout ce dont vous avez besoin pour le func de rappel. Mon point principal était que vous avez déjà une fonction nommée, il n'est donc pas nécessaire d'ajouter deux niveaux de périmètre en ligne. Il vous suffit de modifier asyncfunction code> de sorte que retourne i> une fonction à appeler par le Settimeout code>. C'est une approche plus propre.
Si vous utilisez ECMAScript6 Vous pouvez utiliser Promesse .
Créez donc une fonction de retard qui enveloppe l'appel au Settimeout en une promesse: P>
async someFunction(listings, function() {
for (var i in listings ) {
var listing = listings[i];
await delay(5000);
await asyncFunction(listing);
console.log('Done');
}
});
Si "la liste" est vraiment un tableau, vous ne devriez pas itérer avec "pour ... dans". Utilisez plutôt un index numérique.
@Pointy oui c'est juste un tableau, oups :)