5

for ループを一時停止し、指定するまで続行しないようにする必要があります。ループしている配列内の項目ごとに、別のデバイスで操作を実行するコードを実行します。配列内の次の項目にループする前に、その操作が完了するまで待機する必要があります。

幸いなことに、そのコード/操作はカーソルであり、after:セクションを備えています。

ただし、 for ループ全体が即座に実行されているため、これを防ぐ必要があります。指定されるまでループが継続しないようにする方法はありますか? それとも、別のタイプのループか、使用する必要があるものでしょうか?

after:私の最初の (貧弱な) アイデアは、カーソルの部分が に設定されるまで、継続的に実行される for ループ内に while ループを作成することでしbooleantrue。これにより、ブラウザがロックされました:(私が恐れていたように。

私にできることはありますか?私はjavascriptにかなり慣れていません。しかし、私は現在のプロジェクトを楽しんでいます。

これがそのwhile-loop試みです。から(現在配列内の2つのアイテム)に即座に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++;
  }
}
4

1 に答える 1

5

for ループを使用して各要素をループしないでください。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);

いくつかのオプションを指定して関数を呼び出し ( のように$.ajax())、after()セクションはプロセスの最後に呼び出される関数であると想定しました (のようsuccess()$.ajax())

コールする「モジュール」がコールバックで適切に終了していない場合は、setTimeout()after()を使用して、次の要素でプロセスを遅延させて起動できます

編集:実際のコードでは、次のようになります:

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
            }
        }
    });
}
于 2012-12-07T15:51:55.997 に答える