Я использую setTimeout
, чтобы визуализировать алгоритм обучения усилению и любопытно относительно его поведения.Порядок вызовов setTimeout
Следующий код показывает setTimeout, используемый в то время как oop. Каждая итерация цикла должна использовать версию state
, которая была изменена предыдущей итерацией. Есть ли вероятность, что второй вызов setTimeout произойдет до первого, а значение состояния не будет правильно обновлено? Я прошу частично, потому что я думаю, что я действительно заметил какое-то странное поведение, когда время задержки слишком мало, журналы консолей вызовов 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 всегда выполняются по порядку. – c69
Я не знаю об этом поведении, но обратите внимание, что существует [минимальная задержка] (https://developer.mozilla.org/en/DOM/window.setTimeout#Minimum_delay_and_timeout_nesting). Возможно, вы можете получить странные результаты, если вы установите задержку меньше минимальной задержки. – pimvdb