2012-12-07 19 views
5

Muszę wstrzymać pętlę for i kontynuować, dopóki nie określę. Dla każdego elementu w tablicy, którą przeglądam, uruchamiam kod, który uruchamia operację na oddzielnym urządzeniu i muszę poczekać, aż ta operacja zostanie zakończona, zanim przejdzie do następnego elementu w tablicy.Nie kontynuuj JavaScript pętli for dopóki nie zostanie podana

Na szczęście ten kod/operacja jest kursorem i zawiera sekcję after:.

Jednak od razu uruchomiono całą pętlę for, której muszę zapobiec. Czy jest jakiś sposób, aby uniemożliwić kontynuowanie pętli, dopóki nie zostanie podana? A może inny rodzaj pętli lub coś, co powinienem użyć?

My pierwszy (słaba) Chodziło o to, aby w pętli while w pętli for biegnący w sposób ciągły, aż część after: kursora ustawić boolean do true. To właśnie zamknął przeglądarkę :(jak się obawiałem, że będzie.

mogę coś zrobić? Jestem całkiem nowy, javascript. Byłem ciesząc się mój aktualny projekt chociaż.

Oto while-loop próba. wiem, że natychmiast uruchomiony całą pętlę ponieważ dataCounter idzie z 1 do 3 (dwie pozycje w tablicy obecnie) natychmiast:

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

post jakiś kod, który próbowałeś. Ludzie będą bardziej chętni do pomocy, jeśli masz rzeczywisty kod pokazujący, co zrobiłeś i dlaczego nie działa. –

+0

Ciało pętli for powinno być więc zadaniem asynchronicznym? – Bergi

Odpowiedz

5

nie używać dla pętli do pętli na każdym elemencie trzeba, w. after:, aby zapamiętać, który element macierzy masz po prostu zrobione, a następnie przejść do następnego.

coś takiego:

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

Przypuszczałem, że wywołania funkcji z niektórych opcji (jak byś dla $.ajax()) i że sekcja after() jest funkcja o nazwie na końcu procesu (jak success() dla $.ajax())

Jeśli „moduł” nazwać nie jest właściwie zakończony w after() zwrotnego można użyć setTimeout() aby uruchomić proces następnego elementu z opóźnieniem

EDIT: Z prawdziwego kodu byłoby coś takiego:

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

Dzięki! Właśnie tego szukałem! Wiedziałem, że musi istnieć coś bardziej idealnego niż pętla for. Nie wiem, dlaczego nie mogłem wymyślić twojego rozwiązania. Jeszcze raz dziękuję za pomoc (wszystko, co mam teraz zrobić tutaj?; _;) EDYCJA: odczekaj 2 minuty i kliknij Przyjmij odpowiedź, rozumiem: D – addMitt