2010-12-02 50 views
1

J'ai un script dont j'ai besoin pour sortir de la file d'attente d'exécution javascript. J'ai trouvé que je peux le faire avec quelques méthodes.File d'attente d'exécution asynchrone JavaScript et setTimeout?

alert();//of course we can't use this one. 

setTimeout(function(){ 
    someScript();//works, but are there vulnerabilites? 
}, 1); 

Quelles sont les autres méthodes et quelle est la bonne façon de sortir de la file d'attente d'exécution javascript?

Si setTimeout est la meilleure option, quelles sont les vulnérabilités de l'utilisation de setTimeout? Y a-t-il des problèmes futurs possibles, possibilité que le code dans le délai ne soit pas appelé, problèmes de vitesse, etc.

+0

Vous ne savez pas exactement ce que vous entendez par "bump out". En outre, dans votre commentaire où vous dites 'utiliser jQuery ici', ce n'est pas jQuery. C'est juste du JavaScript courant, pas besoin de jquery. – Matt

+0

quand vous dites "vulnérabilités" demandez-vous des choses à surveiller? (variable scope, context, etc) – zzzzBov

+0

@Matt, Le navigateur met en file d'attente les appels javascript. Par bump out je veux dire, sortir de cette file d'attente, et requeue. Le commentaire est pour ce qu'il y a dans la fonction que j'appelle. J'ai oublié de le supprimer pour cet exemple. – UpHelix

Répondre

3

setTimeout est la manière typique d'interrompre le flux d'exécution. alert() n'est pas la même chose, il est synchrone - il arrêtera votre code jusqu'à ce que OK soit pressé, et reprendra où il s'est arrêté. Lorsque vous utilisez setTimeout, cela libère le thread pour aller exécuter une autre section de code.

Les seules vulnérabilités ne sont pas de savoir ce que vous faites. Le codage asynchrone est un peu plus délicat que la synchronisation codée. Et vous devez surveiller votre contexte, car l'utilisation de "this" ne fonctionnera pas:

object = { 
    firstMethod: function(){ 
     setTimeout(function(){ 
      this.secondMethod(); // won't work! 
     }, 30); 
    }, 
    secondMethod: function(){} 
} 
+1

Votre réponse pourrait être interprétée qu'il n'y a aucun moyen d'exécuter 'secondMethod' à partir du contexte de la fonction timeout. Je recommande de mettre à jour pour refléter que c'est encore possible. – alex

1

Fondamentalement, vous parlez d'exécuter en dehors de la pile actuelle, en d'autres termes de manière asynchrone. setTimeout() est le chemin à parcourir dans ce cas et le code après setTimeout() sera exécuté avant la fonction de rappel.

1ms dans setTimeout() ne fonctionne jamais mais il est en réalité 1ms. Le plus rapide que vous pouvez habituellement obtenir est d'environ 10ms dans mon expérience.

1

setTimeout est le moyen de le faire. Il suffit de noter que le second paramètre est timeout dans millisecondes pas secondes