2010-03-17 7 views
5

Je pense que je pourrais être surmenés, mais je ne peux pas pour la vie de me donner un sens, et je pense qu'il est dû à un manque de connaissance de javascriptJavaScript setTimeout setInterval au sein d'une fonction

var itv=function(){ 
return setInterval(function(){ 
    sys.puts('interval'); 
}, 1000); 
} 
var tout=function(itv){ 
return setTimeout(function(){ 
    sys.puts('timeout'); 
    clearInterval(itv); 
}, 5500); 
} 

Avec ces deux fonctions que je peux appeler

a=tout(itv()); 

et d'obtenir une minuterie en boucle pour fonctionner pendant 5,5 secondes, puis quitter, essentiellement.



Par ma logique, cela devrait fonctionner, mais il est tout simplement pas

var dotime=function(){ 
return setTimeout(function(){ 
    clearInterval(function(){ 
    return setInterval(function(){ 
    sys.puts("interval"); 
    }, 1000); 
    }); 
}, 5500); 
} 

toute idée à ce sujet serait appréciée.

Répondre

7

il ne peut pas travailler parce que votre setInterval sera appelé après le délai d'attente! votre approche originale est correcte et vous pouvez toujours envelopper cela en fonction unique:

var dotime=function(){ 
    var iv = setInterval(function(){ 
    sys.puts("interval"); 
    }, 1000); 
    return setTimeout(function(){ 
    clearInterval(iv); 
    }, 5500); 
}; 
+0

C'est définitivement ça. Il ne crée pas l'intervalle tant que le rappel de délai d'attente n'est pas exécuté. –

+0

Merci pour l'appel de réveil/réponse concise, je ne sais pas ce que je pensais – dagoof

+0

+1, la magie de fermeture comme il est le meilleur. –

4

Je pense que l'erreur que vous faites est que la fonction itv ne renvoie pas setInterval(function(){ sys.puts('interval'); }, 1000) il exécute setInterval(function(){ sys.puts('interval'); }, 1000) et que renvoie un ID que setInterval génère. Cet ID est ensuite passé à la fonction clearInterval pour arrêter ce que fait setInterval(function(){ sys.puts('interval'); }, 1000).

Modifier: Exemple d'une fonction qui fonctionnerait.

 
var dotime=function(){ 
// Start our interval and save the id 
var intervalId = setInterval(function(){ 
    // This will get executed every interval 
    sys.puts("interval"); 
}, 1000); 

// Start our timout function 
setTimeout(function(){ 
    // This will get executed when the timeout happens 
    clearInterval(intervalId); // Stop the interval from happening anymore 
}, 5500); 
} 
+0

Nice, cela fonctionne – user460114

1

Ceci est une autre façon d'écrire votre version, vous voyez que vous passez une fonction à clearInterval, où vous devriez avoir passé un identifiant de minuterie .

var dotime=function(){ 
var g=function(){ 
    var f=function(){ 
    return setInterval(function(){ 
    sys.puts("interval"); 
    }, 1000); 
    } 
    clearInterval(f); 
} 
return setTimeout(g, 5500); 
} 

Pour le faire fonctionner, vous appelez la fonction qui devraient:

clearInterval(f()); 

Ou, en utilisant votre version:

var dotime=function(){ 
return setTimeout(function(){ 
    clearInterval(function(){ 
    return setInterval(function(){ 
    sys.puts("interval"); 
    }, 1000); 
    }()); 
}, 5500); 
} 

Disclaimer: Je n'ai pas testé cela.

Questions connexes