所以我有一个使用setTimeout()
的递归函数,但我不知道如何继续将参数传递给setTimeout()
正在调用的递归函数。我尝试使用.bind(null, time)
并以这种方式传递参数,但这似乎不起作用。
我还尝试了使用setTimeout的第三个选项,该选项我认为是用于传递变量的,但似乎也不起作用。我将尝试用我的代码示例进行解释...
我正在使用此功能的唯一方法是设置不同的超时延迟。
function delay(t) {
return (500 - (t * pattern.length));
}
这就是给我带来麻烦的原因
function next(time) {
//random code ~turn on//
setTimeout(function() {
//random code ~turn off//
if(score < 50) {
setTimeout(next.bind(null, time), delay(time));
}
}, delay(time));
}
当我调用函数时
next(30)
我的代码的//random code ~turn on
部分运行正常,但是setTimeut函数几乎没有任何延迟地运行。就像没有传递time
变量(30)一样。控制台中也没有错误代码。
感谢您的帮助!
答案 0 :(得分:2)
我不确定您是在尝试做复杂的事情还是在使简单的事情复杂化。但是,按原样编写代码,最大的问题是您正在遮盖time
参数:
function next(time) {
//random code ~turn on//
setTimeout(function(time) {
// time is now undefined, because nothing is passed in
// to to setTimeout third param
if(score < 50) {
// time here no longer refers to the `time` passed into
// next, but rather the undefined value delcared as a parameter
// to the callback to setTimeout.
setTimeout(next.bind(null, time), delay(time));
}
}.bind(null, time), delay(time));
}
结果是您的超时以未定义的延迟被调用。删除它可以使其正常工作(如果我了解您在做什么)。您还可以将超时函数传递给捕获time
闭包的超时,因此不需要绑定:
// fake score and delay for demonstration purposes
function delay(t) {
return t;
}
function next(time) {
setTimeout(function() { // don't pass a paran here (or if you do, rename it)
let score = Math.random()
console.log("running", score)
if(score < .80) {
setTimeout(next.bind(null, time), delay(time));
}
}, delay(time));
}
next(1000)