我有一个递归函数,里面包含一些绘图代码。我被建议使用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;
}
}
答案 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()