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, поэтому любое руководство было бы полезно
Ответы
Ответ 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