Javascript - 在递归函数中获取setTimeout的返回值

时间:2012-01-12 21:45:37

标签: javascript recursion return settimeout

我有一个递归函数,里面包含一些绘图代码。我被建议使用setTimeout,因为我的绘图直到执行结束才显示。首先,我只将绘图代码放在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 个答案:

答案 0 :(得分: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
  }

答案 1 :(得分:0)

这给了我说的意思,但如果你有一个全局变量,返回值会怎样呢?在doLearning结束时设置它,然后当您检测到超时/绘图完成时,检查全局。

答案 2 :(得分: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');
    }
  }
}

答案 3 :(得分:0)

通过如下调用,当前的执行上下文(即当前doLearning实例的环境)形成一个闭包,其中time,{ {1}}等仍可用于observedData语句中定义的匿名函数。

因此,以下内容应该有效:

setTimeout()