对于在循环中跳过的循环值

时间:2018-03-27 16:23:44

标签: node.js for-loop

我在node.js应用程序中有这个for循环:

for (var runNumber=1; runNumber<=numberOfRuns; runNumber++) {
  runNumberQueue.place(function(){
    versionRunningService.runMultiVersionJobs(
      queue, jobId, sVersion, jobType, runNumber, currentConfig, allJobsConfig, appDir, function(){
        runNumberQueue.next();
        currentIterationCount++;
        if (currentIterationCount === numberOfIterations) {
          callback();
        }
    });
  });
}

它的结构有什么不对吗?它似乎递增runNumber然后用runNumberQueue.place 1执行runNumber函数,跳过runNumberQueue.place的{​​{1}}执行并再次正确执行runNumber } 3。

我想知道它是否可能是一些异步问题,但是认为runNumber会在某个阶段用runNumberQueue.place 2执行?

1 个答案:

答案 0 :(得分:1)

JavaScript在循环内部工作的方式是在循环分数内定义的变量(例如,此处为runNumber)绑定到同一范围。因此,当您在循环中运行匿名函数时,它会使用绑定到循环范围的变量,而不是函数范围。

这是JS循环中的常见情况。要避免这种情况,您可以定义辅助变量来捕获循环索引变量的值,也可以定义外部函数而不是匿名函数。

辅助变量:

for (var runNumber=1; runNumber<=numberOfRuns; runNumber++) {
  var runNumberCopy = runNumber;
  runNumberQueue.place(function(){
    versionRunningService.runMultiVersionJobs(
      queue, jobId, sVersion, jobType, runNumberCopy, currentConfig, allJobsConfig, appDir, function(){
        runNumberQueue.next();
        currentIterationCount++;
        if (currentIterationCount === numberOfIterations) {
          callback();
        }
    });
  });
}

外部功能:

for (var runNumber=1; runNumber<=numberOfRuns; runNumber++) {
  placeRunNumberQueue(runNumber);
}

// this function can be defined elsewhere and passed all the required arguments
function placeRunNumberQueue(runNumber) {
  runNumberQueue.place(function(){
    versionRunningService.runMultiVersionJobs(
      queue, jobId, sVersion, jobType, runNumber, currentConfig, allJobsConfig, appDir, function(){
        runNumberQueue.next();
        currentIterationCount++;
        if (currentIterationCount === numberOfIterations) {
          callback();
        }
    });
  });
}

another post更详细地讨论了这个问题。