2009-03-25 3 views
9

Fondamentalement, je veux être en mesure d'envelopper n'importe quelle commande dans une méthode $ .holdTillFinished() qui ne permettra pas l'exécution de continuer jusqu'à ce que la méthode spécifiée/jquery animation est terminée l'exécution.Est-il possible d'arrêter l'exécution en javascript/jquery?

Je suppose que cela peut être difficile ou même impossible en javascript, mais j'espère que quelqu'un le saura.

Je ne veux pas entendre parler de la façon dont je peux passer un rappel dans une animation pour qu'elle soit exécutée inachevée, ou quoi que ce soit d'autre. Je veux vraiment savoir si une telle chose est possible et comment s'y prendre.

Si cela ne se produit pas si quelqu'un connaît un plugin de file d'attente agréable qui est capable de mettre en file d'attente des méthodes et des animations définies par l'utilisateur, ce serait cool aussi. Ce que je veux vraiment est un moyen de retarder l'exécution si. (Tout en permettant des animations de fonctionner)

+0

@thirsty: Vous voulez une file d'attente et dequeue, je pense (déjà suggéré et rejeté par vous ci-dessous). Vous pouvez mettre en file d'attente des méthodes arbitraires avec des animations et elles seront exécutées dans l'ordre. Si ce n'est pas ce que vous demandez, pourriez-vous clarifier votre question en donnant un exemple de ce que vous essayez de faire? – Prestaul

+0

Je n'ai pas vu de file d'attente qui fonctionne pour les fonctions. Ce que je veux dire c'est que si je passe une animation, puis une fonction, puis une animation dans la file d'attente alors que ces animations jouent la fonction ne devrait pas être en cours d'exécution. Aussi je ne veux pas avoir à spécifier combien de temps la fonction prendra pour s'exécuter. – thirsty93

+0

Mais vraiment ce que je veux, c'est un wrapper qui arrête tout javascript jusqu'à ce que la fonction/animation que je lui ai passé a été résolue – thirsty93

Répondre

10

Je soupçonne que cela peut être difficile, voire impossible en javascript

Votre soupçon est correct. Les méthodes telles que les animations, les boucles d'entrée utilisateur et les requêtes XMLHttpRequests 'async = true' doivent renvoyer le contrôle au navigateur pour continuer, et le navigateur ne peut pas reprendre le contrôle tant que tous les niveaux d'appel de fonction ne sont pas retournés. Cela signifie que tout votre code, y compris la fonction appelée 'holdTillFinished()', doit se dérouler: donc 'holdTillFinished()' est impossible.

D'autres langues ont des fonctionnalités de contrôle de flux qui vous permettent d'exécuter efficacement un processus asynchrone comme celui qui apparaît à l'appelant comme synchrone, et vice versa. Les plus connus sont threads et continuations. JavaScript ne possède pas ces fonctionnalités, donc le mieux que vous pouvez faire est des délais d'attente et des rappels. La définition d'un rappel en tant que fonction en ligne pour accéder aux variables de la fonction englobante dans une fermeture en retire au moins une partie de la douleur, d'autres langages doivent commencer à encapsuler chaque bit d'état d'un objet. propriétés pour réaliser ceci.)

+0

Quelles sont ces autres langues? Curieux ... –

+0

Bien à peu près tous les langages modernes (non-browser) vous donnent des threads, en utilisant le support du système d'exploitation. Les continuations/coroutines peuvent être trouvées dans au moins Haskell, ML et Scheme et quelques extensions à d'autres langages (par exemple Stackless Python); il y a des primitives en C qui peuvent être utilisées pour construire des continuations. – bobince

+0

Bien sûr, dans le monde du navigateur, vous êtes bloqué: à part JavaScript, il n'y a que VBScript, et c'est encore pire! JavaScript 1.7 (dans Firefox 2) vous donne des générateurs de style Python, qui sont une forme limitée de continuation qui ne vous aiderait pas vraiment ici. – bobince

3

Vous êtes probablement pour http://docs.jquery.com/Effects/queue

Mais si vous êtes à la recherche d'une façon plus généralisée de retarder les choses, Je l'ai utilisé cet extrait avant (je n'ai pas écrit, donc tout le crédit va à l'auteur original):

//Simple wrapper enabling setTimout within chained functions. 
$.fn.wait = function(time, type) { 
    time = time || 1000; 
    type = type || "fx"; 
    return this.queue(type, function() { 
    var self = this; 
    setTimeout(function() { 
     $(self).dequeue(); 
    }, time); 
    }); 
}; 
+0

Cela ne retarde pas l'exécution jusqu'à ce que la fonction se termine. Ce que cela fait, c'est retarder l'exécution dans la file d'attente d'une certaine limite de temps que je définis. Je ne sais pas combien de temps il faut pour exécuter une fonction donnée et je ne devrais pas avoir à deviner. – thirsty93

+0

C'est mieux que rien. Mais ce n'est vraiment pas ce que je cherche. – thirsty93

0

Vous pouvez utiliser une architecture de publication/abonnement pour réaliser ce que vous voulez. Sans trop savoir ce que vous voulez accomplir, je suppose que cela fonctionnera pour vous. La façon dont cela fonctionne est que vous regardez la fin de la fonction comme un événement, auquel vous pouvez écouter et attacher des gestionnaires. Dojo has a pubsub mechanism, mais je suis sûr qu'il y en a d'autres.

+0

C'est exactement ce que je ne veux pas. Un rappel que je passe à la fonction/animation en question – thirsty93

0

Il se défend sur la situation, mais normalement il est nécessaire d'afficher une image de traitement à afficher lorsque AJAX est appelé ou toute boucle s'exécute en javascript. J'ai une situation où j'appelle AJAX dans une boucle, pour que l'utilisateur montre que l'image de traitement est montrée. Pour terminer, j'ai fait un tour. J'ai mis un bouton pour annuler le travail quand cette fonction est appelée. J'ai mis une variable globale 'cancelJob' à true et dans la boucle où je vérifie ce global si cela est vrai l'exécution retournera false et le script s'arrêtera.

var cancelJob = false; 
foreach(){ 
    if(cancelJob == true) 
     return false; 
} 

function cancelButtonPress(){ 
    cancelJob = true; 
} 
Questions connexes