2012-12-07 18 views
5

Ho bisogno di mettere in pausa un ciclo for e non continuare fino a quando non lo specifichi. Per ogni elemento dell'array che sto trasmettendo, eseguo del codice che esegue un'operazione su un dispositivo separato, e devo aspettare che l'operazione sia terminata prima di eseguire il ciclo sull'elemento successivo nell'array.Non continuare Javascript for-loop fino a quando specificato

Fortunatamente, quel codice/operazione è un cursore e presenta una sezione after:.

Tuttavia, è stato eseguito l'intero ciclo for all'istante, che ho bisogno di prevenire. C'è un modo per impedire che il ciclo continui fino a quando specificato? O forse un diverso tipo di loop o qualcosa che dovrei usare?

mia prima (scarso) idea era di fare un ciclo while all'interno del ciclo for che correva continuamente, finché la parte after: del cursore impostato un boolean a true. Questo appena chiuso il browser :(Come ho temuto.

Posso fare qualcosa? Sono abbastanza nuovo per javascript. Sto godendo il mio progetto attuale però.

Ecco il tentativo while-loop. lo so che è in esecuzione l'intero ciclo immediatamente perché il dataCounter va da 1 a 3 (due voci nella matrice attualmente) all'istante:

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

postale del codice che avete provato. Le persone saranno più disponibili ad aiutare se hai codice reale che mostra ciò che hai fatto e perché non funziona. –

+0

Quindi, il corpo del ciclo for dovrebbe essere un task asincrono? – Bergi

risposta

5

non utilizzare un ciclo for per ciclo su ogni elemento, è necessario, in. after: per ricordare quale elemento dell'array hai fatto e poi passare a quello successivo.

Qualcosa di simile a questo:

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); 

ho pensato che si chiama una funzione con alcune opzioni (come si farebbe per $.ajax()) e che la sezione after() è una funzione chiamata alla fine del processo (come success() per $.ajax())

Se il "modulo" si chiama non è correttamente conclusa nel after() callback si potrebbe usare setTimeout() per avviare il processo sull'elemento successivo con un ritardo

EDIT: Con il codice vero e proprio sarebbe qualcosa di simile:

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

Grazie! Questo e 'esattamente quello che stavo cercando! Sapevo che doveva esserci qualcosa di più ideale di un ciclo for. Non sono sicuro del motivo per cui non ho potuto pensare alla tua soluzione. Grazie ancora per l'aiuto (tutto quello che dovrei fare qui ora?; _;) EDIT: attendere 2 minuti e premere Accetta risposta, capito: D – addMitt

Problemi correlati