【发布时间】:2012-01-18 21:04:18
【问题描述】:
我正在使用setTimeout 来可视化强化学习算法,并对它的行为感到好奇。
以下代码显示了在 while oop 中使用的 setTimeout。循环的每次迭代都应使用 state 的版本,该版本已被上一次迭代修改。是否有可能第二次调用 setTimeout 会发生在第一次之前,并且 state 的值不会正确更新?我之所以问,部分原因是我认为我实际上注意到了一些奇怪的行为,当延迟时间太短时,对 doLearningInnerLoop 的调用的控制台日志出现故障(即时间将 = 1 4 3 2 5 6 ..etc)。
var doLearningInnerLoop = function(time, observedData, stateHolder, domain, sampleAction, selectModel, numSamples, depth, discount, stateQueries) {
console.log("new Round, time = " + time);
var state = stateHolder.state;
var currentModel = selectModel(observedData, 10, stateQueries);
var bestAction = sparseSampleMcmc(depth, numSamples, discount, currentModel, state, sampleAction, stateQueries);
var newStateReward = domain.executeAction(bestAction, stateQueries);
observedData.push(bestAction, newStateReward[1], newStateReward[0]);
stateHolder.state = newStateReward[0];
}
var doLearningLoops = function(time, observedData, state, domain, sampleAction, selectModel, numSamples, depth, discount, stateQueries) {
stateHolder = {};
stateHolder.state = state;
while(stateQueries['canContinue']['codeAsFunction'](time, stateHolder.state) === true) {
setTimeout(doLearningInnerLoop, 1000, time, observedData, stateHolder, domain, sampleAction, selectModel, numSamples, depth, discount, stateQueries);
time += 1;
}
return state;
}
【问题讨论】:
-
别着急,JS中的定时器总是按顺序执行的。
-
我不知道这种行为,但请注意有一个minimum delay。如果你设置的延迟小于最小延迟,也许你会得到奇怪的结果。
标签: javascript loops settimeout