У меня есть рекурсивная функция в моем файле JavaScript. Это выглядит примерно так:

function process(node){
    if(someCondition)
        return someValue;
    a = process(node.children);
    b = doSomething(a);
    return b;
}

Проблема в том, что я хочу отображать состояние системы для вывода HTML на каждом шаге этой рекурсии. Между каждым шагом должна быть задержка. (Просто предположим, что я хочу отображать рекурсию вживую для пользователей). На любом другом языке я бы использовал вызов delay () внутри функции, но поскольку JavaScript не поддерживает ничего, кроме setTimeout (), чтобы сделать что-то подобное, я заблудился, потому что я не знаю, как использовать вызов setTimeout в данном конкретном случае. дело.

Обычно в более простых случаях я бы использовал что-то вроде этого:

function process(node){
    if(someCondition)
        return someValue;
    setTimeout("process(node.children)", delay);
}

; но так как моя оригинальная функция возвращает значение, я не знаю, как продолжить.

Заранее спасибо.

1
Niyaz 3 Сен 2010 в 10:51

5 ответов

Лучший ответ

Я думаю, что это не будет работать как чисто рекурсивный алгоритм.

Вы можете сохранить текущее значение b в глобальной переменной.

Затем вы можете использовать setInterval для обработки значения аналогичным образом, обновляя значение b на каждой итерации, используя clearTimeout, чтобы остановить выполнение при выполнении условия.

1
Matt 3 Сен 2010 в 14:38

Вы можете легко обновить dom, если используете «безопасную» рекурсию, см. https: / /stackoverflow.com/questions/24208676/how-to-use-recursion-in-javascript/24208677

/*
this will obviously crash... and all recursion is at risk of running out of call stack and breaking your page...

function recursion(c){
    c = c || 0;
    console.log(c++);
    recursion(c);
}
recursion();

*/

// add a setTimeout to reset the call stack and it will run "forever" without breaking your page!
// use chrome's heap snapshot tool to prove it to yourself.  :)

function recursion(c){
    setTimeout(function(c){
        c = c || 0;
        console.log(c++);
        recursion(c);
    },0,c);
}

recursion();

// another approach is to use event handlers, but that ultimately uses more code and more resources
0
Community 23 Май 2017 в 12:13
  • Поместите все звонки в анонимные функции.
  • Поместите их в очередь.
  • Используйте рекурсивную функцию, чтобы применить 0ms setTimeout к каждой функции.

Примере:

var queue = [];
queue.push(function(){callYourCodeThatTakesSomeTime('param1','param2','...')});
var defer = function(queue){
    if (!queue.length)
        return;
    queue.shift()();
    setTimeout(defer, 0, queue);
}
defer(queue);
1
c0rnh0li0 7 Ноя 2010 в 22:16

Что об этом?

var result;

function process(node) {
  if (arguments.length > 1) {
    result = doSomething(result);
    displayResult();
  }
  if (someCondition) {
    result = someValue;
    displayResult();
    return;
  }
  setTimeout(function() {
    process(node.children, true);
  }, delay);
}
0
gtournie 15 Май 2013 в 13:53

Вы можете попробовать веб-работника, если вы ориентируетесь на HTML5 ,

0
Seth 3 Сен 2010 в 06:55