2017-05-12 2 views
0

Ich bin neu in Javascript und ich habe Probleme mit der setInterval() -Funktion richtig.Aufruf von mehreren setInterval() Funktionen in js mit einer Schleife

Grundsätzlich möchte ich eine Funktion in verschiedenen vorgegebenen Intervallen für verschiedene Parameter aufrufen, die beide in Listen enthalten sind.

Ich habe eine Funktion namens MyFunction. Ich habe eine Liste namens myparam mit allen Variablen, die ich dieser Funktion übergeben möchte. Und schließlich habe ich eine Liste namens myfrequency, die die Zeit in Millis ist, die ich zwischen jedem Aufruf meiner Funktion mit dem in myparam angegebenen Parameter haben möchte. Ich versuche, so etwas wie diese, aber es funktioniert nicht:

for(i=0;i<myparam.length();i++;){ 
    setInterval(function(){myfunction(myparam[i]);},myfrequency[i]); 
    } 

Das Ergebnis des obigen Codes ist, dass es nur für den letzten Index funktioniert. Meine Funktion wird im richtigen Intervall mit dem richtigen Parameter für NUR den letzten Wert in Myparam aufgerufen.

Warum passiert das? Denke ich, dass setInterval() den Aufruf einer Funktion in einem Intervall inkorrekt einrichtet?

+1

http://stackoverflow.com/questions/2728278/what-is-a-practical-use-for-a-closure-in-javascript die Antworten lesen, einer von ihnen zeigt Ihr genaues Problem –

+0

Sehr häufiges Problem. Was passiert, wenn die setInterval-Funktion ausgelöst wird, ist die Schleife bereits abgeschlossen, sodass "i" auf das letzte Element zeigt. – david

+0

@david fügt eine Verzögerung hinzu, um das zu beheben? Ich habe versucht, eine Verzögerung mit setTimeout() für jedes Mal setInterval ist aufgerufen, aber jetzt funktioniert es überhaupt nicht. – Saxman13

Antwort

0

Nun ist es da setInterval eine Verzögerung hat, was bedeutet, wenn das Intervall läuft die Schleife bereits

fertig gewesen ist

Um das zu tun einfach eine andere Funktion erstellen, die Ihr Intervall

function StartInterval(index, frequency) { 
    setInterval(function(){ 
     myfunction(index); 
    },frequency); 
} 

Dann beginnt in Ihrem Schleife nur diese Funktion aufrufen und übergeben Sie etwas

for(i=0;i<myparam.length;i++){ 
    StartInterval(myparam[i], myfrequency[i]) 
} 


 
/** set what value you want **/ 
 
var myparam = [10,20,30]; 
 
var myfrequency = [1000,2000,3000]; 
 

 

 
function myfunction(index) { 
 
    console.log(index); 
 
} 
 

 
function StartInterval(index, frequency) { 
 
    setInterval(function(){ 
 
    myfunction(index); 
 
    },frequency); 
 
} 
 

 
for(i=0;i<myparam.length;i++){ 
 
    StartInterval(myparam[i], myfrequency[i]) 
 
}

+0

Dah - schlag mich einfach dazu! Auch zu beachten - das Original-Javascript hat ein paar Syntaxprobleme. myparam.length ist eine Eigenschaft, keine Funktion (unter der Annahme, dass myparam ein Array ist), und das letzte Semikolon der for-Schleife (i ++;) wird nicht benötigt. Der Grund, dass dies ein Problem ist, befasst sich mit einem sogenannten "Closure". Da die Variable i in dem Bereich liegt, in dem Sie "myfunction" aufrufen, ist der Wert von i bis zum Ablauf des Interval-Timers tatsächlich jenseits des Endes Ihres myparam-Arrays. Daher bin ich überrascht, dass es sinnvolle Informationen geben würde. Es sollte "undefined" an meine Funktion senden. – pacifier21

+0

Vielen Dank! @Beginner Ich habe das, was du gesagt hast, in meinen Code aufgenommen und es funktioniert jetzt einwandfrei !! – Saxman13

+0

@ facifier21 Ja, ich weiß, dass meine Syntax im Original schrecklich war, ich habe versucht, den tatsächlichen Code, den ich habe, zu vereinfachen, und ich habe ein paar Dinge geändert – Saxman13

Verwandte Themen