Бекон.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 ответ:
В нынешнем беконе.реализация js (0.6.x) все "бесконечные" последовательности, основанные на рекурсии, обречены на неудачу, потому что на каждом шаге "стек потоков" становится глубже. Я уверен, что есть способ оптимизировать реализацию, чтобы лучше справляться с такого рода конструкциями, но это далеко не тривиально.
Для вашего конкретного случая метод
fromGenerator
упростит вашу реализацию. Если вам интересно, в этой фиксации уже есть соответствующий код. Я предлагаю вам использовать GitHub вопросы на случай, если вы заинтересованы в том, чтобы это исправить.