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