Рекурсия и setTimeout в JavaScript - PullRequest
       22

Рекурсия и setTimeout в JavaScript

1 голос
/ 03 сентября 2010

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

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

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

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

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

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

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

Ответы [ 5 ]

1 голос
/ 03 сентября 2010

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

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

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

1 голос
/ 08 ноября 2010
  • Поместите все вызовы в анонимные функции.
  • Поместите их в очередь.
  • Используйте рекурсивную функцию для применения setTimeout 0 мс к каждой функции.

Пример:

var queue = [];
queue.push(function(){callYourCodeThatTakesSomeTime('param1','param2','...')});
var defer = function(queue){
    if (!queue.length)
        return;
    queue.shift()();
    setTimeout(defer, 0, queue);
}
defer(queue);
0 голосов
/ 13 июня 2014

Вы можете легко обновить 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 голосов
/ 15 мая 2013

Как насчет этого?

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 голосов
/ 03 сентября 2010

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

...