2017-11-16 1 views
1

Ich habe einen einfachen Zähler mit Javascript erstellt, aber es gibt ein Problem Feld "Anzeige" beginnt von 1, aber es sollte von 100 beginnen und wird niedrig. Die Konsolenprotokolle zeigen Werte korrekt von 100 bis 1. Ich habe Loops verwenden, um diese Aufgaben zu tun, also bitte nicht ersetzen Rekursion :) Auch das Timeout ist sicher zu 100ms nicht gleich, es ist mehrJavascript-Zähler mit for-Schleife

function wyswietlLiczbe(j) { 
 
    setTimeout(function() { 
 
     document.getElementById("display").innerHTML = j; 
 
    }, 100); 
 
} 
 

 
for (var i= 100; i > 0; i--){ 
 
    console.log(i) 
 
    wyswietlLiczbe(i); 
 
}
<p id="display"></p>

+3

die Schleife überhaupt ohne zu warten, erledigt wird, und Sie nur das Ergebnis der letzten siehe 'wyswietlLiczbe' – IrkenInvader

Antwort

3

Da die Schleife sofort ausführt, müssen Sie für jede Zahl eine zunehmende Menge an Zeit warten. Dadurch werden die innerHTML Änderungen anstehen.

Wie es jetzt ist, nach 100ms Wartezeit werden alle 100 wyswietlLiczbe in schneller Folge ausgeführt.

function wyswietlLiczbe(j, waitTime) { 
 
    setTimeout(function() { 
 
     document.getElementById("display").innerHTML = j; 
 
    }, waitTime); 
 
} 
 

 
for (var i= 100; i > 0; i--){ 
 
    console.log(i) 
 
    wyswietlLiczbe(i, (101 - i) * 100); 
 
}
<p id="display"></p>

+0

Ok nennen i didn Ich weiß, dass ich für jede Nummer eine längere Zeit warten muss und die Änderungen in die Warteschlange stellen muss. Es ist typisch für Javascript? Ich kann keine Funktionen in Javascript wie Schlaf in C#/Java/Python finden :) – siemaeniu500

+0

@ siemaeniu500 gibt es keine Schlaf-Funktion in JavaScript. Die Idee der Sprache ist/war single threaded und async. – Bakudan

+0

Ich würde es wahrscheinlich mit Rekursion tun, warten 100ms zwischen jedem Anruf. Um es mit der for-Schleife zu tun, die Sie angefordert haben, müssen Sie die Wartezeiten zusammenfassen. In Javascript ist die Art, wie Sie schlafen, mit 'setTimeout'. Dies könnte auch mit 'setInterval' (im Grunde ein setTimeout, das kontinuierlich Schleifen) erreicht werden. – IrkenInvader

1

die bedingte in die Funktion bauen, die nach dem Timeout ausgeführt wird.

var elmD = document.getElementById("display"); 

function wyswietlLiczbe(j) { 
    setTimeout(function() { 
     elmD.innerHTML = j; 

     j--; 

     if(0 <= j) { 
     wyswietlLiczbe(j) 
     } 
    }, 100); 
} 

wyswietlLiczbe(100); 
1

Ich weiß nicht genau, was Sie wollen, aber ich denke, das ist, was Sie suchen.

function wyswietlLiczbe(j) { 
 
    if (j >= 0) { 
 
     setTimeout(function() { 
 
      document.getElementById("display").innerHTML = j; 
 
      j--; 
 
      wyswietlLiczbe(j); 
 
     }, 100); 
 
    } 
 
} 
 

 
wyswietlLiczbe(100);
<p id="display"></p>

0

können Sie setInterval anstelle

function wyswietlLiczbe(j) { 
    x = setInterval(function() { 
     if(j==0) clearInterval(x); 
     document.getElementById("display").innerHTML = j--; 
    }, 100); 
} 
wyswietlLiczbe(100);