2012-01-18 3 views
1

Я использую 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; 
} 
+0

Не волнуйтесь, таймеры в JS всегда выполняются по порядку. – c69

+0

Я не знаю об этом поведении, но обратите внимание, что существует [минимальная задержка] (https://developer.mozilla.org/en/DOM/window.setTimeout#Minimum_delay_and_timeout_nesting). Возможно, вы можете получить странные результаты, если вы установите задержку меньше минимальной задержки. – pimvdb

ответ

0

Я считаю, что я нашел аналогичную проблему с вызовами setTimeout в ожидаемом порядке.

см: Are equal timeouts executed in order in Javascript?

Ответ выше в том, что Firefox, кажется, сделать это правильно (на основе источника), а кто-то другой имеет также некоторые против вопроса (возможно, они были в другом браузере).