Я вычисляю некоторую тяжелую рекурсивную функцию (скажем, Фибоначчи для следующего кода). У меня есть две версии: - первая, ванильная рекурсивная (раскомментирующая "if (false)") - вторая, использующая process.nextTickкаждые 5 вызовов для запуска другого кода (без комментария «if (n% 5 == 0)»)
, выполняющегося первым, я получаю «RangeError: Превышен максимальный размер стека вызовов» при запуске второгоодин дает мне хороший "196418"
вот код. Не могли бы вы рассказать мне, что происходит, потому что я не могу поверить, что process.nextTick очищает стек.
'use strict';
function fibo_cb( n, cb ){ fibo_rec( n, (res) => cb( res ) ); }
function fibo_rec( n, ret ){
if( n<2 ){
ret( 1 );
} else {
let rr = (res_1) => { return (res_2) => ret(res_1+res_2) };
let r = (res_1) => fibo_rec( n-2, rr(res_1) );
//if(false){ //no tick
if(n%5==0){ //do tick, once every 5
process.nextTick( () => fibo_rec( n-1, r ) );
} else {
fibo_rec( n-1, r );
}
}
}
fibo_cb( 26, console.log );