2010-12-22 15 views
4

Guten Morgen,Warten Sie, bis die Funktion beendet ist, bevor Sie erneut starten

Ich versuche, die gleiche Funktion jedes Mal aufzurufen, wenn der Benutzer eine Taste drückt. Hier ist das, was im Moment passiert ..

Benutzer Schaltfläche klickt -> Anrufe Funktion -> Funktion nimmt 1000ms + zu beenden (durch Animation mit jQuery und AJAX-Aufrufe)

Was ich will geschehen ist jedes Mal, wenn die Benutzer drückt die Taste, fügt die Funktion der Warteschlange hinzu, wartet auf das Beenden des vorherigen Anrufs und startet dann.

Ist das möglich?

Sorry, wenn meine Erklärung ein wenig verwirrend ist ..

Dank Matthew

+1

Sie möchten die Animationen und den Ajax richtig in die Warteschlange stellen? – Cole

Antwort

6

Da Funktionen Objekte sind, können sie Eigenschaften speichern. Sie können Ihre Funktion veranlassen, bei jedem Aufruf eine 'queue'-Eigenschaft für sich selbst zu inkrementieren (Taste gedrückt) und dann am Ende der Funktionsausführung zu überprüfen, ob die Eigenschaft der Warteschlange selbst> 0 ist, und wenn ja, dekrementieren Sie die Eigenschaft queue um eins und rufen Sie sich erneut mit setTimeout.

+3

Der beste Weg, dies zu tun, ist mit einem setTimeout-Aufruf. Ansonsten ist dies ein Rezept für einen Stapelüberlauf. ;-) – draeton

+1

+1 @draeton Guter Punkt! Wenn sich die Funktion am Ende selbst aufruft, sollte sie in einem setTimeout mit einer Verzögerung von Null ausgeführt werden. – Kai

+0

@draeton: In der Tat hat das auch den Vorteil, dass die Rendering-Engine des Browsers etwas bewirken kann (und die böse Box vermeidet "Skript Y scheint für einige Zeit beschäftigt zu sein. Töte es?") –

0

Vor kurzem hatte ich dies in meiner eigenen Anwendung zu tun. Der beste Vorschlag, den ich für Sie habe, ist (vorausgesetzt, Sie haben Ihre AJAX-Aufrufe bereits in einer JavaScript-Funktion), um einen Callback-Funktionsparameter an Ihre JavaScript-Funktion zu übergeben. Rufen Sie dann im Abschnitt success Ihres AJAX-Anrufs Ihre Rückruffunktion auf.

Beispiel:

// In HTML <script> tags. 
$(document).ready(function() { 
    $("button#queue").click(function() { 
     GetMembers(GetGroups(), MemberCallback)); 
    }); 
}); 

function GetMembers(userId, callback) { 
    $.ajax({ 
     //Initialized AJAX properties 
     url: "/My/Project/Ajax/Page.extension", 
     data: "{ 'groupId':'" + groupId + "'}", 
     success: function (result) { 
      callback(result.d); 
     } 
    }); 
} 

function MemberCallback(members) { 
    // Do your thing here. 
} 
0

Sie könnten eine Callback-Funktion auf die man hinzufügen, dass die Animation macht, sobald die Animation den Rückruf beendet es heißt, so können Sie tun, was Sie wollen.

folgt hier ein Beispiel aus der jquery docs:

$('#clickme').click(function() { 
    $('#book').animate({ 
    opacity: 0.25, 
    left: '+=50', 
    height: 'toggle' 
    }, 5000, function() { 
    // Put your code here, so it will be executed once the animation completes 
    }); 
}); 

P. S .: Morgen? Es ist fast Mitternacht, D

+0

: D Fast Mitternacht auch hier. BTW, ich nehme an, er weiß nicht im Voraus (wenn diese Animation beendet ist), ob die Taste erneut gedrückt wird oder nicht. –

0

Sie können verfolgen eine globale Warteschlange/Array, die Sie der Warteschlange jedes Mal hinzufügen, wenn der Benutzer die Taste drückt, dann möchten Sie einen Rückruf in Ihrer Funktion (z. B. in der success Callback für jQuery), die die Warteschlange überprüft und die nächste Funktion in der Warteschlange aufruft.

+0

Keine Notwendigkeit für globale Namespace-Verschmutzung: Fügen Sie dem Objekt, das damit arbeitet, einfach eine Eigenschaft hinzu. –

-1

Deaktivieren Sie die Schaltfläche, wenn sie darauf klicken. Aktivieren Sie es, wenn die Ajax-Routine abgeschlossen ist.

Verwandte Themen