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

Другие вопросы по тегам