Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
В предыдущей версии в основе лежал цикл, который перебирал символы шаблона, выискивал включения, и заменял на что нужно, ну вообщем как обычно.— здесь я конечно хватил немного. Я имел ввиду, что принцип обработки шаблона так или иначе связан с перебором символов содержимого, по крайней мере, я не могу назвать какой либо другой возможный принцип поиска, допустим необходимого нам символа в тексте, без использования каких либо техник индексации и тд. Как правило(по крайней мере я бы точно сделал так), используется конструкция вида:
eval_str=exp_str.replace(/(#[^#]+#)/g, f_var_replacer).
function forEachAsync(list, iterator, ret) {
if (!(list instanceof Object)) return ret();
var keys, key, length, last;
var i = -1, calls = 0, looping = false;
if (list instanceof Array) {
length = list.length;
} else {
keys = Object.keys(list);
length = keys.length;
}
last = length - 1;
var resume = function() {
calls += 1;
if (looping) return;
looping = true;
while (calls > 0) {
calls -= 1, i += 1;
if (i === length) return ret();
key = (keys ? keys[i] : i);
iterator(list[key], function(stop) {
if (stop === true) ret();
else resume();
}, key, i, last);
}
looping = false;
};
resume();
}
И «рекурсивный вызов» в setTimeout'е это не рекурсия, потому что это не «вызов», а «добавление события» в eventloop, это совершенно архитектурно разные вещиТехника, описанная в статье, конечно, для этого не подходит, но допустим, Вам нужно обойти граф и для этого Вы составили функцию, которая оказалась по всем формальным критериям, рекурсивной. Далее Вы её как-то реализовали в коде. Какая разница, как там под капотом это будет реализовано: через стек, циклом или событиями eventloop? JS увы, требует в коде явно решать такие вопросы, которые большинству программистов не интересны.
Есть async идеально подходящий для этого. Для кроссбраузерности есть промисы (которые в крайнем случае прекрасно полифилятся на callback'ах).В 2013 промисов в действующем стандарте ES5 не было, async/await (которые суть сахар над промисами) тем более. С промисами же решение становится почти тривиальным.
Переполнение стека вызовов JavaScript, SetTimeout и снижение производительности AJAX