JQuery отложено в каждом цикле
Это должно быть простым. У меня есть функция, которая вызывается, и мне нужно дождаться завершения всех асинхронных операций. что я хочу, это что-то вроде этого...
self.processSchema(data).done(function(results){ //do stuff});
Функция processSchema выполняет цикл с использованием $.each и вызывает асинхронный метод.
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());
}
Это не похоже на работу, я новичок в $. Отложено, так что любое руководство будет полезно
2 ответа
Решение
Вам понадобится обещание для каждой итерации
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();
}
Для извергов по функциональному программированию (как и я) вот вариант ответа Аденео с одним выражением:
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