передача аргументов в рекурсивные функции

1

Таким образом, у меня есть рекурсивная функция, использующая 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
    Интересно, вы могли бы исправить второй пример, чтобы его синтаксис был правильным. Из-за отсутствия заключительных абзацев и отступов трудно сказать, что вложено в что.
  • 0
    Я только что заметил эту проблему форматирования, я исправил это спасибо!
Показать ещё 12 комментариев
Теги:
settimeout
recursion
this

1 ответ

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню