web-dev-qa-db-fra.com

jquery différé dans la boucle .each

Cela devrait être simple. J'ai une fonction qui est appelée et je dois attendre la fin de toutes les opérations asynchrones. ce que je veux c'est quelque chose comme ça ...

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

La fonction processSchema boucle en utilisant $ .each et appelle une méthode asynchrone.

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());
}

Cela ne semble pas fonctionner, je suis nouveau sur $ .Deferred, donc tout conseil serait utile

27
gdex

Vous aurez besoin d'une promesse pour chaque itération

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();
}
34
adeneo

Pour les démons de programmation fonctionnelle (comme moi), voici une version à expression unique de la réponse d'Adeneo :

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();
};

Je voudrais également noter que vous itérez sur table, mais que vous ne faites rien avec chaque élément de l'itération (c'est-à-dire que le rappel dans votre each n'a pas d'arguments.) Maintenant, Je ne sais pas quel est votre objectif, mais cela ne me semble pas juste: P

7
Milosz