Javascript - получение возвращаемого значения для setTimeout в рекурсивной функции - PullRequest
2 голосов
/ 13 января 2012

У меня есть рекурсивная функция, которая содержит код для рисования внутри.Мне посоветовали использовать setTimeout, так как мой рисунок не отображался до конца выполнения.Сначала я поместил только код рисования в setTimeout, но это не помогло, однако когда я поместил основной рекурсивный цикл в setTimeout, рисование работало отлично, как показано ниже.(т.е. state как показано ниже).Как я могу получить это возвращаемое значение при использовании setTimeout, или решить эту проблему другим способом.

var doLearning = function(time, observedData, state, domain, sampleAction, selectModel, numSamples, depth, discount, stateQueries) {
    if(stateQueries[0](time, state) === true) {
        console.log("New Round");
        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]);
        console.log(time);
        setTimeout(doLearning, 100, time + 1, observedData, newStateReward[0], domain, sampleAction, selectModel, numSamples, depth, discount, stateQueries);
    } else {
        console.log("Game Over");
        return state;
    }
}

Ответы [ 4 ]

1 голос
/ 13 января 2012

Создайте объект со всеми вашими переменными, например:

var game = {
     time: ... ,
     observedData: ...., 
     state: .... etc
 }

В doLearning получить и изменить свойства этого объекта при необходимости:

  var doLearning = function(obj) {

       if(obj.state == ....)
           obj.currentModel = whatever...
           obj.bestAction = whatever...
           setTimeout(function() { doLearning(obj) }, 100)
       else
           game over
  }
0 голосов
/ 13 января 2012

Вызывая следующим образом, текущий контекст выполнения (т. Е. Среда текущего экземпляра doLearning) формирует замыкание , в котором time, observedData и т. Д.остаются доступными для анонимной функции, определенной внутри оператора setTimeout().

Таким образом, должно работать следующее:

setTimeout(function(){
    doLearning(time + 1, observedData, newStateReward[0], domain, sampleAction, selectModel, numSamples, depth, discount, stateQueries);
}, 100);
0 голосов
/ 13 января 2012

Без всего кода мне трудно понять, но, возможно, было бы лучше использовать setInterval, вот простой пример.

function draw(){
  var state=//whatever
  var num = setInerval(doLearning,100)  

  function doLearning(){
    //You have access and can modify state and do not need to return its value
    if(){}
    else{
      clearInterval(num);
      console.log('Game over');
    }
  }
}
0 голосов
/ 13 января 2012

Это дает мне волю сказать, но что, если бы у вас была глобальная переменная, куда возвращалось бы возвращаемое значение?Установите его в конце doLearning, затем, когда вы обнаружите, что тайм-аут / рисование сделано, проверьте глобальный.

...