2012-12-07 18 views
5

Ich muss eine for-Schleife anhalten und nicht weiter, bis ich angeben. Für jedes Element im Array, das ich durchlaufe, führe ich Code aus, der einen Vorgang auf einem separaten Gerät ausführt, und ich muss warten, bis dieser Vorgang beendet ist, bevor ich zum nächsten Element im Array übergebe.Fortsetzung nicht Javascript for-Schleife bis angegeben

Glücklicherweise ist dieser Code/Vorgang ein Cursor und verfügt über einen after: Abschnitt.

Allerdings hat es die gesamte for-Schleife sofort ausgeführt, was ich verhindern muss. Gibt es eine Möglichkeit, zu verhindern, dass die Schleife fortgesetzt wird, bis sie spezifiziert wird? Oder vielleicht eine andere Art von Schleife oder etwas, das ich verwenden sollte?

Meine erste (schlecht) Idee war, eine while-Schleife in der for-Schleife zu bilden, die kontinuierlich lief, bis der after: Teil des Cursors zu einem booleantrue gesetzt. Dies ist nur der Browser gesperrt :(Da ich befürchtete, es würde.

Alles, was ich tun kann? Ich Javascript ziemlich neu bin. Ich habe allerdings mein aktuelles Projekt genossen.

Hier ist der while-loop Versuch. ich weiß, es sofort die gesamte Schleife läuft, weil die dataCounter1-3 (zwei Elemente im Array zur Zeit) geht sofort:

if(years.length>0){ 
    var dataCounter = 1; 
    var continueLoop; 
    for(var i=0;i<years.length;i++){ 
    continueLoop = false; 
    baja.Ord.make(historyName+"?period=timeRange;start="+years[i][1].encodeToString()+";end="+years[i][2].encodeToString()+"|bql:select timestamp, sum|bql:historyFunc:HistoryRollup.rollup(history:RollupInterval 'hourly')").get(
     { 
      ok: function (result) { 
      // Iterate through all of the Columns 

      baja.iterate(result.getColumns(), function (c) { 
      baja.outln("Column display name: " + c.getDisplayName()); 
      }); 
     }, 
     cursor: { 
      before: function() { 
      baja.outln("Called just before iterating through the Cursor"); 
      counter=0; 
      data[dataCounter] = []; 
      baja.outln("just made data["+dataCounter+"]"); 
     }, 
     after: function() { 
      baja.outln("Called just after iterating through the Cursor"); 
      continueLoop = true; 
     }, 
     each: function() { 

      if(counter>=data[0].length) { 
      var dateA = data[dataCounter][counter-1][0]; 
      dateA += 3600000; 
      } 
      else { 
      var dateA = data[0][counter][0]; 
      } 

      var value=this.get("sum").encodeToString(); 
      var valueNumber=Number(value); 

      data[dataCounter][counter] = [dateA,valueNumber]; 
      counter++; 
     }, 
     limit: 744, // Specify optional limit on the number of records (defaults to 10)2147483647 
     offset: 0 // Specify optional record offset (defaults to 0) 
     } 
     }) 
     while(continueLoop = false){ 
      var test = 1; 
      baja.outln("halp"); 
     } 
    dataCounter++; 
    } 
} 
+2

Beitrag einige Code, den Sie haben versucht: Mit Ihrem echten Code es so etwas wie dieses wäre. Die Leute werden eher bereit sein zu helfen, wenn Sie tatsächlich Code haben, der zeigt, was Sie getan haben und warum es nicht funktioniert. –

+0

Also sollte der Körper der for-Schleife eine asynchrone Aufgabe sein? – Bergi

Antwort

5

keine for-Schleife Schleife auf jedes Elemente verwenden Sie brauchen, in der. after: zu erinnern, welches Element des Arrays Sie haben gerade fertig und dann zum nächsten gehen.

Etwas wie folgt aus:

var myArray = [1, 2, 3, 4] 

function handleElem(index) { 
    module.sendCommand({ 
     ..., // whatever the options are for your module 
     after: function() { 
      if(index+1 == myArray.length) { 
       return false; // no more elem in the array 
      } else { 
       handleElem(index+1)} // the after section 
      } 
    }); 
} 

handleElem(0); 

ich davon ausgegangen, dass Sie eine Funktion mit einigen Call-Optionen (wie würden Sie für $.ajax()) und dass der after() Abschnitt ist eine Funktion am Ende des Prozesses genannt (wie success() für $.ajax())

Wenn das „Modul“ Sie rufen nicht richtig in der after() Rückruf beendet könnten Sie setTimeout(), den Prozess auf das nächste Element mit einer Verzögerung

starten

EDIT:

function handleElem(index) { 
    baja.Ord.make("...start="+years[index][1].encodeToString()+ "...").get(
    { 
     ok: ... 
     after: function() { 
      if(index+1 == years.length) { 
       return false; // no more elem in the array 
      } else { 
       handleElem(index+1)} // the after section 
      } 
     } 
    }); 
} 
+0

Danke! Genau das habe ich gesucht! Ich wusste, dass es etwas Idealeres geben musste als eine For-Schleife. Nicht sicher, warum ich nicht an deine Lösung denken konnte. Nochmals vielen Dank für die Hilfe (alles, was ich jetzt hier tun soll?; _;) EDIT: warten Sie 2 Minuten und drücken Sie auf die Antwort, um es zu bekommen: D – addMitt