我在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执行?
答案 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更详细地讨论了这个问题。