Таким образом, у меня есть рекурсивная функция, использующая 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) не передается. Также я не получаю никаких кодов ошибок в консоли.
Спасибо за любую помощь!
Я не уверен, что вы пытаетесь сделать что-то сложное или вы усложняете что-то простое. Но с кодом, как он есть, самая большая проблема заключается в том, что вы затеняете свой аргумент 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)
undefined
с рекурсией. Я обновил свой вопрос, чтобы показать, что я изменил. Я думаю, что я все еще что-то упускаю ...
setTimeout(function(time)
функция, передаваемая в setTimeout, принимает параметр time
, но ничего не передается в эту функцию. Так что время не определено. Теперь, когда вы пытаетесь использовать time
внутри тайм-аута, у вас есть перезаписать исходное time
переданное в next()
с неопределенным значением.