2012-12-07 3 views
5

for 루프를 일시 중지하고 지정할 때까지 계속하지 않아야합니다. 루핑 할 배열의 각 항목에 대해 별도의 장치에서 작업을 실행하는 코드를 실행하고 배열의 다음 항목으로 반복하기 전에 해당 작업이 끝날 때까지 기다려야합니다.지정된 때까지 자바 스크립트 루프를 계속 수행하지 마십시오.

다행히도 코드/연산은 커서이며 after: 섹션이 있습니다.

그러나 for 루프를 즉시 실행하고 있으므로이를 방지해야합니다. 루프가 지정 될 때까지 계속되지 않게 할 방법이 있습니까? 아니면 내가 사용해야하는 다른 유형의 루프 또는 무언가?

내 첫 번째 (가난한) 아이디어는 커서의 after: 부분이 trueboolean을 설정할 때까지 지속적으로 실행 한 대한 루프 내에서 잠시 루프를 만드는 것이 었습니다. 나는 그것이 것 두려워으로이 단지 :(브라우저를 둘 것. 내가 할 수있는

아무것도? 내가 자바 스크립트로 비교적 새로운 해요. 내가 여기.하지만

을 내 현재 프로젝트를 즐기고 while-loop 시도이다 있었어요. 나는 dataCounter가 (현재 배열의 두 항목) 13까지 간다 때문에 즉시 즉시 전체 루프를 실행중인 알고

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

후 당신이 시도하는 코드 : 실제 코드로이 같은 것입니다. 실제로 수행 한 작업과 작동하지 않는 작업을 보여주는 실제 코드가 있다면 사람들은 더 기꺼이 도울 것입니다. –

+0

그래서 for 루프의 본문은 비동기 작업이어야합니까? – Bergi

답변

5

은 각 요소에 대해 루프 루프를 사용하지 마십시오 당신은에 필요합니다. after: 배열의 어느 요소를 기억하고 있는지 방금 완료 한 다음 다음으로 이동하십시오. 이 같은

뭔가 :

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

내가 좋아하는 (success()을 (당신이 $.ajax()에 대해서와 같은) 당신은 몇 가지 옵션이있는 함수를 호출한다는하고 after() 섹션은 프로세스의 끝에서 호출 함수라고 가정 당신이 부르는 "모듈"제대로 after() 콜백에서 종료되지 않은 경우 $.ajax())

당신은 지연과 함께 다음 요소의 프로세스를 시작하는 setTimeout()를 사용할 수

편집 :

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

감사! 이것은 내가 찾고 있었던 바로 그 것이다! for 루프보다 이상적인 것이 있어야한다는 것을 알고있었습니다. 왜 내가 너의 해결책을 생각할 수 없었는지 모르겠다. 도와 주셔서 다시 한번 감사드립니다. (지금 여기서해야 할 일은 무엇입니까?) 편집 : 2 분 정도 기다렸다가 답을 수락합니다. D : D – addMitt

관련 문제