Подтвердить что ты не робот

Jquery отложен в цикле .each

Это должно быть просто. У меня есть функция, которая вызывается, и мне нужно дождаться завершения всех операций async. я хочу что-то вроде этого...

self.processSchema(data).done(function(results){ //do stuff});

Функция processSchema выполняет цикл с использованием $.each и вызывает метод async.

var processSchema = function(data)
{
     var def = new $.Deferred();
     $.each(table, function()
     {
         //calls an async SQLitePlugin method
         db.executeSql(sql, data, function(tx, results){
            def.resolve(results);
         }
     }

     return(def.promise());
}

Это не работает, я новичок в $.Deferred, поэтому любое руководство было бы полезно

4b9b3361

Ответ 1

Вам потребуется обещание для каждой итерации

var processSchema = function(data) {
     var promises = [];

     $.each(table, function() {
         var def = new $.Deferred();
         db.executeSql(sql, data, function(tx, results){
            def.resolve(results);
         });
         promises.push(def);
     });

     return $.when.apply(undefined, promises).promise();
}

Ответ 2

Для функционального программирования дроидов (например, я) здесь приведена одна версия выражения adeneo answer:

var processSchema = function(data) {
    return $.when.apply($, $.map(table, function() {
        var def = new $.Deferred();
        db.executeSql(sql, data, function(tx, results){
            def.resolve(results);
        });
        return def;
    })).promise();
};

Также я хотел бы отметить, что вы выполняете итерацию по table, но ничего не делаете с каждым элементом в итерации (т.е. обратный вызов в вашем each не имеет аргументов.) Теперь я не знаю, какова ваша цель, но мне это не кажется правильным: P