Ты можешь использовать генераторы, очень хорошая штука для JS.
Допустим у тебя есть цикл который делает итерацию переменной:
function* foo(){
var index = 0;
while(index <= 2)
yield index++; // yield будет прерывать работу функции на этом месте
}
Вот так это вызывается
var iterator = foo();
console.log(iterator.next()); // { index:0 }
console.log(iterator.next()); // { index:1 }
console.log(iterator.next()); // { index:2 }
То есть при вызове
iterator.next() функция продолжает работать с того места где остановилась.
А вызывать
iterator.next() будешь с помощью
setTimeout