javascript - 在指定之前不要继续 Javascript for 循环

标签 javascript for-loop continue

我需要暂停 for 循环并且在我指定之前不继续。对于我正在循环访问的数组中的每个项目,我运行一些代码在单独的设备上运行一个操作,我需要等到该操作完成后再循环到数组中的下一个项目。

幸运的是,该代码/操作是一个游标,并且具有 after: 部分。

但是,它一直在立即运行整个 for 循环,我需要阻止这种情况。有什么办法可以防止循环继续直到指定?或者可能是不同类型的循环或我应该使用的东西?

我的第一个(糟糕的)想法是在连续运行的 for 循环中创建一个 while 循环,直到光标的 after: 部分设置一个 booleantrue。这只会锁定浏览器 :( 正如我担心的那样。

有什么我可以做的吗?我是 javascript 的新手。不过,我一直很喜欢我目前的项目。

这是 while-loop 尝试。我知道它会立即运行整个循环,因为 dataCounter 立即从 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++;
  }
}

最佳答案

不要使用 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() 部分是一个调用于您的流程结束(例如 $.ajax()success())

如果您调用的“模块”没有在 after() 回调中正确结束,您可以使用 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
            }
        }
    });
}

关于javascript - 在指定之前不要继续 Javascript for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13766327/

相关文章:

javascript - 视差背景滚动方程 - 示例包括

javascript - Angular Testing : tick vs flushMicrotasks in fakeAsync block

java - 在 GWT 中移动元素映射的视口(viewport)?

javascript - PHP:从 case 语句中回显 JQuery 警报

继续循环无法正常工作

php "continue"似乎不工作

使用 For 和 While 循环将 JavaScript 控制台输出到单行

postgresql - 有条件地选择要在 FOR 循环中迭代的集合

c - 如何在一个循环中组合序列号和null?

android - 如何保存和检索 Android 应用程序上次运行的数据?