2016-04-06 18 views
0

Anforderung ist ziemlich einfach, aus einigen Gründen kann ich das nicht aussortieren. Äußere Funktion ruft innere Funktion auf. Die innere Funktion ist asynchron und ruft die innere Funktion auf, wenn die Bedingung erfüllt ist. Alles in Ordnung - jetzt Benutzer kann äußere Funktion ausführen, während innere Funktion läuft. Ich möchte, dass die innere Funktion sofort aufhört zu arbeiten und neu anzufangen.Verhindern, dass innere Funktion ausgeführt wird

document.getElementById("demo").addEventListener("click", function() { 
demo_click(); 
}); 
// 
function demo_click() { 
var idnum = 0; 
var length = 25; 
innerFunc(); 
// 
function innerFunc() { 
    if (idnum < length) { 
    console.log(idnum); 
    setTimeout(function() { 
    idnum++; 
    innerFunc(); 
    }, 500); 
    } 
} 
} 

Es wird wie erwartet von 0 bis 24 protokolliert. Hier ist Geige - https://jsfiddle.net/h7ab8u69/2/

Lösung könnte trivial sein, aber bitte schlagen Sie mir vor, was/wo die Bedingung zu setzen.

EDIT

Von Anfang an neu meinte ich, dass frühere Anrufe von innerFunc aufhören würde, und es wird die Anmeldung (Konsole) von Null beginnen. Es beginnt immer noch bei Null, aber wenn Sie zweimal klicken, dreimal und so weiter - Protokolle (Konsole) wird auch von früheren Aufrufen von InnerFunc angezeigt. Bitte besuchen Sie oben den Fiddle Link und öffnen Sie die Konsole und klicken Sie auf den Button - das Problem ist offensichtlich.

PS

SetTimeout nur asynchroner Aufruf anzuzeigen. In meinem Code ist das Image.onLoad -Ereignis. Daher ist das Löschen des Timeouts keine Option. Grundsätzlich lade ich Bild nach dem anderen auf Knopfdruck. Ich möchte das vorherige Laden beenden und das Laden mit einem weiteren Klick starten. Um es einfach zu machen, habe ich SetTimeout verwendet.

+0

Können Sie näher erläutern, was bedeutet dieser Ausdruck "aufhören zu arbeiten sofort und neu anfangen" bedeuten? (um den ersten Anruf zu verhindern ... oder um den Anruf der Funktion zu verschieben?) – RomanPerekhrest

+0

zeigen Sie Ihren tatsächlichen Code mit "Image.onLoad Ereignis" – RomanPerekhrest

+0

hinzugefügt tatsächlichen Code – Prasoon

Antwort

0

Was ich verstanden habe ist, dass Sie etwas Code ausführen möchten und stoppen Sie es, wenn Sie die äußere Funktion erneut ausführen. Wenn es kein Timeout ist, müssen Sie eine globale Variable verwenden.

var clickCount=0; 

function demo_click() { 
var idnum = 0; 
var length = 25; 
clickCount++; 
var thisCount = clickCount; 
// stop the loop before starting again 

innerFunc(); 
    function innerFunc() { 
    if (idnum < length) { 
    console.log(idnum); 



    for(var i =0 ; i < imgarraylength; i++){ 
     if(thisCount < clickCount){ 
     break; 
     } 
     idnum++; 
     innerFunc(); 
    } 
    } 
    } 
} 

Ich hoffe, es hilft.

+0

Danke und Entschuldigung, dass ich über die Verwendung von SetTimeout im Hauptpost nicht erwähnt habe. Das ist nur asynchroner Aufruf nachzuahmen. Ich verwende SeTimeout nicht wirklich in meinem Code. Bitte beachten Sie den bearbeiteten Beitrag. – Prasoon

+0

Was meinst du mit asynchronem Aufruf. Ist es Ajax? Wenn es Ajax ist, können Sie in diesem Fall den Ajax-Aufruf auch abbrechen. – rajesh

+0

Sie haben gerade festgestellt, dass Sie das Bild einzeln laden. In diesem Fall sollte vor dem Laden des Bildes überprüft werden, ob eine globale Variable, wenn sie wahr ist, nur geladen wird. sonst brechen Sie aus der Schleife. Und wenn du die äußere Funktion anklickst, stellst du diese Variable auf "wahr", so dass der existierende looop aufhört. – rajesh

Verwandte Themen