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;
}