2010-02-03 6 views
1

Est-ce que javascript a une sorte d'écouteurs d'événements? Je veux exécuter la fonction Inc 2 fois avec différents paramètres, la première exécution de Inc puis la seconde exécution, mais la seconde exécution doit être exécutée après X secondes (settimeout ...) après le premier La fonction Inc est complétée (toutes ses itérations, dès que clearInterval).Event listeners in javascript

J'ai donc besoin d'un type d'événement et d'un écouteur (bien sûr, il doit être asynchrone).
Que pouvez-vous suggérer? (S'il vous plaît pas jquery ...)

function Inc(val1,val2){        
    var intervalID = setInterval(function(){ 
      if (val1 > val2) clearInterval(intervalID); 
      val1= val1 + 10;       
     }, 400); 

} 
+0

Non, vous pouvez attacher à certains gestionnaires d'événements intégrés pour les événements dans la fenêtre, des documents et des éléments DOM (onclick, onload, onunload, etc.), mais vous devez imiter la fonctionnalité de gestionnaire d'événements « réel » par autres moyens. – glomad

Répondre

1

Edit: Eh bien, puisque je ne sais pas pourquoi vous ne voulez pas savoir au sujet de la poursuite, voici une autre suggestion avec exactement le même sémantique, mais peut-être une syntaxe souhaitable, maintenant il y a une simulation d'événement délégation de toute façon :) (chose est, vous avez besoin de la fonction Inc signaler en quelque sorte l'achèvement):

function Inc(val1,val2){ 
    var handle = { oncomplete: null }; 

    var intervalID = setInterval(function(){ 

     if (val1 > val2) 
     { 
      clearInterval(intervalID); 
      if (handle.oncomplete) handle.oncomplete(); 
     } 

     val1 = val1 + 10; 

    }, 400); 

    return handle; 
} 

Inc(10, 40).oncomplete = function(){ alert("Finish"); }; 

précédent: Quelque chose comme cela devrait à l'affaire (je ne l'ai pas tester si):

function Inc(val1,val2, continuation){        
var intervalID = setInterval(function(){ 
    if (val1 > val2) 
    { 
    clearInterval(intervalID); 
    if (continuation) continuation(); 
    } 

    val1 = val1 + 10;       
}, 400); } 

donnons le nom comme celui-ci:

Inc(x, y, function(){ Inc(y, z); }); 
+0

mais dans ce cas Inc "sait" sur le second Inc (bien que anonyme mais sait encore) je ne le veux pas. – luppi

+0

J'ai ajouté une nouvelle suggestion, mais maintenant, vous devez retourner une poignée, donc pas une bonne solution. –

+0

oui, cela va fonctionner. merci – luppi

0

AFAIK il n'y a pas de type de concours complet sur mesure standardisée, mais vous faites le travail autour.

Appeler un « délégué » de cette façon:

var myFunction = function() { 
    // CALL Inc with different params, this is your "event" 
}; 

function Inc(val1, val2) { 
    setInterval(myFunction,400); 
} 

Réponse courte, non pas pour des événements personnalisés (uniquement les événements DOM standard), mais vous pouvez truquer.

2

J'essaie généralement de rester loin de les délais d'attente, surtout si elles traitent avec quelque chose qui nécessite la récursivité.

Mais pourquoi avez-vous besoin de récursivité si la fonction n'est exécutée que deux fois?

// call Inc the first time 
Inc(); 

// this will execute only after the first Inc(); is done. 
// call Inc the second time after X seconds 
setTimeout(Inc, 400); 
+0

Inc foo est pour l'animation (il a plus de code bien sûr), donc j'ai besoin de setinterval – luppi

+0

Je lance Inc première fois pour animer l'élément dans une direction, puis, après x secondes j'utilise même inc pour animer l'objet dans une autre direction – luppi