2016-04-01 14 views
0

Ich habe die Forschung gemacht, also weiß ich zu schätzen, dass es in JavaScript keine Methode sleep() gibt. Was ich nicht herausfinden kann, ist die richtige Alternative für mich, weil setTimeout() meine Situation aufgrund seiner asynchronen Natur nicht löst.Ohne JavaScript Sleep(), wie verzögere ich meine DOM-Änderungen?

Mein Programm analysiert die Eingabe von Benutzern und führt es in einer eval() -Anweisung aus. Der ausführende Code ruft Funktionen auf, die ich bereits geschrieben und den Benutzern zur Verfügung gestellt habe. Zu diesen Funktionen gehört das Zeichnen (Farbe), mit dem ein farbiges Quadrat an einer vom Benutzer definierten Stelle auf dem Bildschirm platziert wird. Es ist nicht unbedingt relevant für die Frage, aber wenn Sie wissen wollen, ich mache nur eine <div> und eine semi-transparente <img> mit den richtigen Höhen einfügen.

Jetzt ist hier, wo ich die Schlaf-Funktion möchte: Wenn der Benutzer viele Quadrate zeichnet, zeigt Javascript sie alle auf einmal, aber ich möchte sie nacheinander anzeigen, mit einer Verzögerung, die ich steuern kann. Dies kann nicht mit setTimeout() durchgeführt werden. Der Versuch, selbst eine Verzögerungsfunktion zu schreiben, die Start- und Endzeiten berechnet, wird den Browser einfach einfrieren, und glauben Sie mir, ich habe es ausprobiert und es zeichnet immer noch alles , nachdem eingefroren wurde.

Mein Instinkt ist, einen Schlaf() Anruf als letzte Zeile meiner draw() Methode, so dass jedes Quadrat, das der Benutzer in ihrem Code erstellt z. 200 ms zu rendern, aber keine solche Funktion existiert.

Oh JavaScript Gurus, wie bekomme ich diese Art von Funktionalität in einer Webseite, wenn Javascript nicht schlafen wird?

ideal:

function draw() { 
    var easel = document.getElementById("canvas"); 
    var square = document.createElement("div"); 
    square.setAttribute("..."); 
    easel.appendChild(square); 

    window.sleep(200); 
} 
+1

Sie Intervall verwenden könnte, um jede Funktion ruft nach jedem Intervall zu ziehen, sobald alle Funktionen das Intervall genannt entfernen – user2950720

+0

_ „Das kann nicht mit getan werden setTimeout() "_ - das ist natürlich völlig unwahr - wenn Performance wirklich ein Problem ist, sollten Sie in' requestAnimationFrame' schauen. – CBroe

+0

Mike hat tatsächlich bewiesen, dass setTimeout() in der Lage war, das zu tun, was ich brauchte, und ohne den Browser einzufrieren, wie praktisch jeder andere Schlaf-Hack (siehe die oben erwähnte "doppelte" Frage, wo ich die richtige Lösung nicht finden konnte) . Vielen Dank, dass Sie mir zeigen, dass setTimeout() mehr ist, als ich ursprünglich dachte. – Cephus5

Antwort

2

Da Sie die Funktionen Ihrer Nutzer fordern steuern, könnten Sie draw ändern die Quadrate in einer Warteschlange zu platzieren. Dann leeren Sie diese Warteschlange langsam und zeichnen jeweils ein Rechteck.

die Situation Einige Pseudo-JS zu beschreiben:

// Collection of things to render 
var rectangles = []; 

// This is the function you have users call for drawing a rectangle 
function draw(color) { 
    rectangles.push(new Rectangle(color)); 
    // do other stuff 
    queueRender(); 
} 

// Slowly draw each rectangle 
function queueRender() { 
    if (alreadyQueued) { 
    return; 
    } 
    alreadyQueued = true; 

    setTimeout(function drawQueue() { 
    var rectangle = rectangles.shift(); // Get the first rectangle 
    if (!rectangle) { 
     alreadyQueued = false; 
     return; 
    } 
    render(rectangle); 
    setTimeout(drawQueue, 200); 
    }); 
} 
+0

Ich denke, ich folge, wohin du damit gehst, und ich werde es ausprobieren - danke im Voraus. Was ist der Zweck des geschachtelten setTimeout? Sie haben eines mit nur einer Funktionsdefinition als Argument "setTimeout (Funktion drawQueue ..." und dann innerhalb dieser Funktion ein anderes setTimeout mit einem rekursiven Aufruf und einem 200 ms Timeout "setTimeout (drawQueue, 200);" - ist das erste a Tippfehler? – Cephus5

+0

Danke, Mike - das funktioniert und erfüllt meine Anforderungen.Ich dachte wirklich, dass es unmöglich war, Hut ab vor dir! – Cephus5