2012-01-12 3 views
2

У меня есть рекурсивная функция, содержащая код чертежа внутри. Мне было рекомендовано использовать setTimeout, так как мой чертеж не показывался до конца извлечения. Сначала я ввел только код чертежа внутри setTimeout, но это не помогло, однако, когда я поставил основной рекурсивный цикл внутри setTimeout, рисунок работал отлично, как показано ниже.Javascript - получение возвращаемого значения для 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; 
    } 
} 
+0

Можете ли вы объяснить, почему * * вам нужно это значение? Это может помочь нам предоставить соответствующий ответ. –

+0

где рекурсия – Esailija

+0

Рекурсия - это вызов doLearning. Мне нужно значение, потому что doLearning на самом деле также вызывается selectModel. Он возвращает модель, которую я использую в следующих шагах, например, при выборе bestAction – zenna

ответ

1

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

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

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

+1

Не обязательно быть глобальным - выходит за рамки 'doLearning'. – lonesomeday

0

Без всего кода мне сложно понять, но, возможно, было бы лучше использовать 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

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

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

setTimeout(function(){ 
    doLearning(time + 1, observedData, newStateReward[0], domain, sampleAction, selectModel, numSamples, depth, discount, stateQueries); 
}, 100); 
Смежные вопросы