2012-12-07 4 views
5

forループを一時停止し、指定するまで続行する必要があります。私がループしている配列の各項目については、別々のデバイスで操作を実行するコードを実行し、配列の次の項目にループする前にその操作が完了するまで待つ必要があります。指定されるまでJavascript for-loopを続行しないでください

幸いにも、そのコード/操作はカーソルであり、after:セクションがあります。

しかし、ループ全体を瞬時に実行していましたが、これを防止する必要があります。ループが指定されるまで継続しないようにする方法はありますか?あるいは、私が使うはずの別の種類のループか何か?

私の最初の(悪い)考えは、カーソルのafter:部分がbooleanからtrueになるまで、連続して実行されるfor-loop内でwhileループを作ることでした。私はそれは私が行うことができます。

何?私はJavaScriptにかなり新しいんだだろう恐れていたよう。私も私の現在のプロジェクトを楽しんできましたこれはちょうど:(ブラウザをロックアップ。

ここwhile-loop試みです​​。私はdataCounterは、(現在のアレイに2つの項目)1から3に行くので、それは即座に、すぐに全体のループを実行している知っている:

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-loopの本体は非同期タスクでなければなりませんか? – Bergi

答えて

5

各要素に対してループにforループを使用しないでくださいあなたは必要、で。 after:あなたが配列のどの要素を覚えているかちょうど完了し、次のものに移動します。

このような何か:私はあなたには、いくつかのオプション(あなたが$.ajax()の場合と同様)で関数を呼び出すと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()あなたが呼ぶ「モジュール」は、正しくafter()コールバックで終了していない場合$.ajax()

のためにあなたが遅延して次の要素でプロセスを起動するsetTimeout()を使用することができ

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

ありがとう!これはまさに私が探していたものです!私はforループよりも理想的なものがなければならないことを知っていました。なぜ私はあなたの解決策を考えることができなかったのか分かりません。もう一度お手伝いをしていただきありがとうございます(私はここで何をやろうとしていますか?);)編集:2分待って、 – addMitt