Бекон.JS максимальный стек вызовов превышен


Я пытаюсь создать поток, подобный Bacon.fromPoll для requestAnimationFrame

Почему следующий код выдает ошибку" максимальный стек вызовов превышен"?

function rafSequence() {
    var raf = Bacon.fromCallback(function(callback) {
        requestAnimationFrame(function() {
            callback(Date.now());
        });
    });
    return raf.merge(raf.flatMap(rafSequence));
}

rafSequence().log();

Я думал, что merge() будет собирать мусор, когда один из 2 потоков бросил Bacon.End (raf в raf.merge(...). Так почему же он ошибается?

Обновление: Я смог реализовать рабочую версию следующим образом:

Bacon.repeat(() => Bacon.fromCallback(requestAnimationFrame));

Меня все еще интересует, почему merge() НЕ убирает.

1 4

1 ответ:

В нынешнем беконе.реализация js (0.6.x) все "бесконечные" последовательности, основанные на рекурсии, обречены на неудачу, потому что на каждом шаге "стек потоков" становится глубже. Я уверен, что есть способ оптимизировать реализацию, чтобы лучше справляться с такого рода конструкциями, но это далеко не тривиально.

Для вашего конкретного случая метод fromGenerator упростит вашу реализацию. Если вам интересно, в этой фиксации уже есть соответствующий код. Я предлагаю вам использовать GitHub вопросы на случай, если вы заинтересованы в том, чтобы это исправить.