2017-03-02 3 views
3

der den folgenden Code Lassen Sie sich vorstellen:Beenden der Schleife abrupt

function DoSomethingHard(parameter1, parameter2, parameter3){ 
    // Do Something Hard Here 
} 

var i; 
for(i = 0; i <= stuff.length; i++) { 
    // "stuff" is an array 
    DoSomethingHard(stuff[i].something1, stuff[i].something2, stuff[i].something3); 
} 

$("#button_to_cancel").click(function() { 
    //something to cancel 
}); 
  • das Array "stuff" Angenommen, hat 100 Positionen, so dass die for-Schleife wird 100 Mal ausgeführt, das heißt, es wird „Do Do Something Hart "100 mal.
  • Betrachten wir auch, dass "DoSomethingHard" etwa 5 Sekunden benötigt, um vollständig auszuführen.

Meine Frage ist: Wie verwalte ich die Aufhebung des "DoSomethingHard"? Wenn es beispielsweise bereits 50 Mal ausgeführt wurde, wie kann ich die nachfolgenden Ausführungen über eine Schaltfläche abbrechen? Es gelang mir nicht in meinen Versuchen und es endet immer die ganze Schleife gelaufen ....

Vielen Dank im Voraus :)

+0

Dies wird als Anti-Pattern betrachtet, aber Sie könnten eine globale Variable erstellen. var isBreak = false; für (i = 0, i

Antwort

0

Sie können nicht einfach kündigen Sie mit einem Klick auf eine Schaltfläche, es sei denn, Sie verwenden Rekursion oder Iteratoren anstelle einer Schleife. Aber Sie können die Schleife in sich selbst mit einer break;-Anweisung abbrechen, wenn eine Bedingung erfüllt ist. Zum Beispiel könnten Sie schreiben:

var result; 
    for(i=0;i<=stuff.length;i++){ 
     result = DoSomethingHard(stuff[i].something1, stuff[i].something2, stuff[i].something3); 
     if (result === 'error' || i === 50) break; 
    } 

Dies wird die Schleife beenden, wenn das Ergebnis der ‚Fehler‘ wird (oder irgendetwas anderes Ihrer Rückkehr aus dem Inneren der Funktion) oder wenn ich erreicht 50.

Nun, da ich denke, davon ist es mit einem Klick möglich, aber es erfordert mehr Code und ist ineffizient. gib mir eine Minute. Update: Ich würde diesen ppttern entweder nicht beraten, aber es ist ziemlich flexibel:

var exitCondition, 
    doSomethingHard = function doSomethingHard(parameter1, parameter2, parameter3){ 
     // Do Something Hard Here 
    }, 
    i, 
    length = stuff.length, 
    result; 
for (i = 0; i <= length; i++) { 
    // "stuff" is an array 
    result = doSomethingHard(stuff[i].something1, stuff[i].something2, stuff[i].something3); 
    if (exitCondition(result, i)) break; 
} 

$("#button1_to_add").click(function() { 
    exitCondition = function(result, index) { 
     return index === 50; 
    }); 
}); 
$("#button2_to_cancel").click(function() { 
    exitCondition = null; 
}); 

Der Schlüssel hier ist eine Ausgangsbedingung haben (oder mehrere), die Sie innerhalb der Schleife überprüfen und den Knopf aktualisiert diese Bedingung haben.

1

Sie können von setInterval machen die Funktion aufrufen und wenn Sie ein Klick-Ereignis haben, können Sie clear the intervals

var mytimeout; 


var i; 
for(i = 0; i <= stuff.length; i++) { 
    // "stuff" is an array 
    mytimeout = window.setInterval(DoSomethingHard(stuff[i].something1, stuff[i].something2, stuff[i].something3), 2000); 
} 

$("#button_to_cancel").click(function() { 
    //something to cancel 
    window.clearInterval(mytimeout) 
}); 
2

Javascript ist single threaded, und eine for-Schleife ausführt, bis es fertig ist. Ich würde so etwas tun, um Zeit für den Abbruch zu lassen.

function DoSomethingHard(param){ 
//do something 
} 

var i = 0; 
var loopInterval = setInterval(function() { 
    if (i >= stuff.length) { 
    clearInterval(loopInterval); 
    return; 
    } 
    DoSomethingHard(stuff[i]); 
    i++ 
}, 10); 

$("#button_to_cancel").click(function() { 
    clearInterval(loopInterval); 
}); 
+0

Was aber, wenn SetInterval vollständig ausgeführt wird und DoSomethingHard() Daten verarbeitet? Wie kann der Benutzer abbrechen? –

+0

Das Intervall wird 'DoSomethingHard' für' stuff [0] 'ausführen, dann nach einem Abbruch suchen. Führen Sie 'DoSomethingHard' für' stuff [1] 'aus und prüfen Sie dann, ob der Vorgang abgebrochen werden kann. Und so weiter. Wenn also jemand mitten in einer Ausführung von 'DoSomethingHard' auf Abbrechen klickt, wird dieser Aufruf beendet, bevor der Prozess abgebrochen wird. –

1

einfachste Art und Weise, wie ich es sehe:

function DoSomethingHard(parameter1, parameter2, parameter3){ 
//Do Something Hard Here 
} 

var i; 
var active = true; //as of now, we want to process stuff 
for(i=0;i<=stuff.length;i++){ 
//"stuff" is an array 
if(active){ 
    DoSomethingHard(stuff[i].something1, stuff[i].something2, stuff[i].something3); 
}else { 
    active = true; //reset active in case we want to run loop again later on 
    break;  // break out of loop 
} 
} 

$("#button_to_cancel").click(function() { 
    active = false; 
}); 
0

Sie müssen diese Schleife zu beachten ist, synchron, wo, wie Ihre Funktion nicht ist. Loop wartet nicht auf DoSomethingHard() Compleye bevor die nächste Iteration beginnt. In nur wenigen Millisekunden wurde DoSomethingHard über hundert Mal aufgerufen! und Ihre Schleife überkommt so im Wesentlichen break ist hier nutzlos.Ich denke, kein Sprachkonstrukt kann hier helfen

Also, was zu tun ist?

Sie müssen entscheiden, ob sich eine globale Flagge schaffen, in der Funktion etwas zu tun oder nicht und überprüfen Sie es innerhalb die Funktion

function DoSomethingHard(){ 
    if(flag50done){ 
    return; 
    }else{ 
    //do what this fn was meant for 
    } 
} 

Sie können mit einem Klick auf eine Schaltfläche Wert von flag50done ändern und weitere Maßnahmen würden angehalten werden aufgrund der return

bei DoSomethingHard einige 3rd-Party-Funktion, die Sie nicht ändern können Sie es in einer anderen Funktion sagen runDecider

wickeln kann
function runDecider(a,b,c){ 
     //add flag check here 
     if(flag50done){ 
     return; 
     }else{ 
     DoSomethingHard(a, b, c); 
     } 
    } 

und diese

var result; 
for(i=0;i<=stuff.length;i++){ 
    result = runDecider(stuff[i].something1, stuff[i].something2, stuff[i].something3); 
} 
0

Sie können eine for-Schleife von UI-Interaktion nicht stoppen in der Schleife nennen, weil alles in einem einzigen Thread ausgeführt wird, und die Aktion wird nur ausgeführt, wenn Schleife vollständig ausführt. Du kannst setInterval als @jason p verwenden.

0

löse ich auf diese Weise:

function DoSomethingHard(parameter1, parameter2, parameter3){ 
    //Do Something Hard 

    var timer = window.setInterval(function(){ 
    var page = $$('.page').data('page'); 
    console.log("The page is: "+page); 
    if(page != 'preview'){ 
     //Cancel... 

     console.log('Aborted'); 
     clearInterval(timer); 
    } 
},1000); 
} 

Das heißt, ich den Umfang geändert. Stattdessen benutze ich den Button click, wenn der Nutzer die Seite verlässt, überwache ich ihn.

Verwandte Themen