2016-03-31 9 views
2

ich nach einem besseren Weg suchen zu wiederholen, wenn eine Funktion wahr oder falsch zurückgibtJS Wiederholfunktion mehrmals, um zu sehen, ob es wahr kehrt

function foo() { // 
     var tabList = window.content.document.getElementById('compTabs') // this might be null if page is not loaded and further code wont work 
     if (!tabList) { // stop here if tab list is null 
      return false; 
     } 
    // continue and finish function 
     } 


// this is a loop that will go trough an array and this check needs to happen for each element of the array 
for (var i; i < loopLenght; i++) { 
    // This is the actual code nothing else happens here. 
     if (!foo()) { 
      // try again 
      if (!foo()) { 
       // try one more time 
       if (!foo()) { 
        console.log('Failed') 
       } 
      } 
     } 
    // a lot more code coming here that should only run one per iteration 
} 

Ich suche nur für einen schönen, sauberen Weg zu schreibe den Code oben.

+0

Sie sollten den vollständigen Code, nicht nur Pseudocode hinzufügen. Siehe [fragen] und [mcve]. – Tushar

+0

Wie wäre es mit 'while (true)'? – Rayon

+1

Die Verwendung einer Schleife wäre sauberer und es wäre einfach, die Anzahl der Wiederholungen später zu ändern. Oder wenn Sie nicht möchten, dass Sie zwischen Wiederholungen etwas Bestimmtes tun, können Sie eine einzige if-Anweisung verwenden (indem Sie die Kurzschlussauswertung nutzen): 'if (! Foo() &&! Foo() &&! Foo()) {/* gescheitert * /} else {/ * gelungen * /} ' – nnnnnn

Antwort

4
var retries = 5; 
var success = false; 

while (retries-- > 0 && !(success = foo())) {} 

console.log(success); 

Hier retries-- zählt bei jeder Schleifeniteration rückwärts und success = foo() führt foo() aus und speichert das Ergebnis in success.

Wenn entweder retries0 oder successtrue erreicht, stoppt die Schleife. Ein Schleifenkörper wird nicht benötigt.

Warnung: Dies funktioniert nicht, wenn foo() eine asynchrone Funktion ist.

+0

Dies ist in der Nähe, aber ich muss weitere Code stoppen, wenn nach 5 Wiederholungen immer noch fehlschlägt, was bedeutet, dass ein weiterer Code hinzugefügt wird wenn Bedingung auf Erfolg, versuchte, den Code so weit wie möglich zu verkürzen. – Trax

+0

Und ...?Sie haben den Wert von "Wiederholungen" und den Wert von "Erfolg" nach der Schleife, ich bin mir ziemlich sicher, dass Sie etwas herausfinden können. (Ich bin mir nicht sicher, warum "das Hinzufügen einer anderen' if' Bedingung "unerwünscht wäre.) – Tomalak

1

Sind Sie in einem Browser? (Im Gegensatz zu Node etc.) Muss es N-mal spezifisch wiederholen?

while (!condition) { } 

Aber das wird blockieren und hängen Sie Ihren Thread.

Wenn Sie abfragen wollen ...

function whileConditionNotMet() 
{ 
    if (!condition) { 
     setTimeout(whileConditionNotSet, 1000); 
     return false; 
    } 

    // Condition met 
    // ... 
    return true; 
} 

Sie die Häufigkeit begrenzen könnte es durch Erhöhen eines statischen Variablen überprüft:

function whileConditionNotMet() 
{ 
    if (typeof whileConditionNotMet.counter == 'undefined') { 
     whileConditionNotMet.counter = 0; 
    } 

    if (whileConditionNotMet.counter++ > 10) { 
     // Timeout 
     // ... 
     return false; 
    } 

    if (!condition) { 
     setTimeout(whileConditionNotSet, 1000); 
     return false; 
    } 

    // Condition met 
    // ... 
    return true; 
} 

... oder ...

var counter = 0; 
while (!condition && counter++ < 10) { } 
+0

Kein Knoten, ein JavaScript + Jquery-Skript lief in FireFox. – Trax

+0

Je nachdem, was Sie tun müssen - (dh wenn es keine Polling-Verzögerung gibt, oder Sie so schnell wie möglich auf die Benutzeroberfläche reagieren müssen) - sollten Sie eine Hintergrundaufgabe in Betracht ziehen beim Umfragen kauen (siehe unten). Ansonsten würde ich einfach schummeln und setTimeout() benutzen, um periodisch "aufzuwachen und den Status zu überprüfen" - damit Sie die Benutzerinteraktion nicht zu stark blockieren. https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers – wally

Verwandte Themen