Спасибо за пример.
Нашел немного другой - протестировал - вроде как работает без задержек:
var second = 0;
var interval = 1000;
var expected = Date.now() + interval;
setTimeout(step, interval);
function step() {
var dt = Date.now() - expected;
if (dt > interval) {
alert('Непредвиденная ошибка'); // ошибка которой не должно быть
} else {
// выполняем нужный код
expected += interval;
setTimeout(step, Math.max(0, interval - dt));
}
}