Javascript setTimeout调用的顺序
我正在使用Javascript setTimeout调用的顺序,javascript,loops,settimeout,Javascript,Loops,Settimeout,我正在使用setTimeout可视化强化学习算法,并对其行为感到好奇 下面的代码显示了while oop中使用的setTimeout。循环的每次迭代都应该使用一个版本的状态,该版本已被上一次迭代修改。是否有可能第二次调用setTimeout会在第一次调用之前发生,并且state的值不会正确更新?我这样问的部分原因是,我认为我实际上注意到了一些奇怪的行为,当延迟时间太小时,对doLearningInnerLoop的呼叫的控制台日志出现了故障(即时间将=1 4 3 2 5 6..等) 我相信我发现了
setTimeout
可视化强化学习算法,并对其行为感到好奇
下面的代码显示了while oop中使用的setTimeout。循环的每次迭代都应该使用一个版本的状态
,该版本已被上一次迭代修改。是否有可能第二次调用setTimeout会在第一次调用之前发生,并且state的值不会正确更新?我这样问的部分原因是,我认为我实际上注意到了一些奇怪的行为,当延迟时间太小时,对doLearningInnerLoop的呼叫的控制台日志出现了故障(即时间将=1 4 3 2 5 6..等)
我相信我发现了一个类似的问题,setTimeout调用没有按预期的顺序发生 见:
上面的答案是Firefox似乎做得很好(根据来源),但其他人也有一些人反对这个问题(可能他们在不同的浏览器上) 别担心,JS中的计时器总是按顺序执行的。我不知道这种行为,但请注意,有一个错误。如果设置的延迟小于最小延迟,可能会得到奇怪的结果。
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;
}