Как выполнить функцию done() сразу после выполнения всех асинхронных процессов в javascript?

В своём проекте работаю с базой данных 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().
  • Вопрос задан
  • 6073 просмотра
Решения вопроса 1
Finom
@Finom
Все Deferred объекты (в том числе и $.ajax) можно запихать в массив, затем вызвать:
$.when.apply( null, DfdArray ).then( done )
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы