В своём проекте работаю с базой данных IndexedDB, которая является асинхронной. Скрипт обходит все элементы в массиве и те, которые удовлетворяют условию, меняет и записывает в базу данных.
Так он может сохранять до нескольких тысяч записей. Работать с базой, после этого, можно только после того, как последняя функция сохранит данные в базе. Как правильно запустить функцию, после выполнения последней из тысяч параллельных функций?
Написал работающий пример, из которого нужно удалить костыль и заменить его на предложенный вами:
function start_async()
{
var len = parseInt(Math.random()*10000); //кол-во асинхронных функций большое и неизвестно заранее
var j=1;
var tim;
for(var i=0;i<=len;i++) {
var how_long = parseInt(Math.random()*20000); //задержка по времени, для эмуляции записи в базу
setTimeout(function(){
console.info("function "+(j++)+" finished");
clearTimeout(tim); //чем заменить этот костыль?
tim = setTimeout(function(){ done(); console.info("All async functions done!"); },50);
}, how_long ); //асинхронные функции
}
}
//Вопрос: как запустить функцию done, сразу после завершения последней функции без задержки и использования костыля с timeout?
PS: В проекте используется jQuery и можно предлагать $.Deferred().