【问题标题】:Order of setTimeout callssetTimeout 调用的顺序
【发布时间】: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


【解决方案1】:

我相信我发现 setTimeout 调用未按预期顺序发生的类似问题。

见:Are equal timeouts executed in order in Javascript?

上面的答案是 Firefox 似乎做得很好(根据源代码),但其他人也有一些问题(可能他们在不同的浏览器上)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多