2014-05-01 3 views
0

J'ai besoin de récupérer plusieurs valeurs d'un IndexedDB, de vérifier si elles remplissent toutes une contrainte (différente pour chacune d'entre elles) et, si c'est le cas, d'appeler une fonction. Pour illustrer cela mieux imaginer que les appels à IndexedDB étaient sychronous, nous aurions quelque chose comme.Vérifier plusieurs valeurs extraites de manière inductive du DB indexé

function myFunc(varNames, conditions) { 
    for(var i = 0; i < varNames.length; i++) { 
     if(!isGood(db.get(varNames[i]), conditions[i])) { 
      return; 
     } 
    } 
    doStuff(); 
} 

Comme IndexedDB est asynchrone, je ne sais pas comment le faire. L'utilisation d'un callback dans chaque get n'est pas vraiment faisable puisque l'appel à doStuff dépend de tous les get. Accumuler les résultats dans une variable globale ne fonctionnerait pas non plus parce que myFunc est appelé plus d'un. J'ai essayé quelque chose comme:

function myFunc(varNames, conditions) { 
    var valid = 0; 
    checker() { 
     valid++; 
     if(valid == varNames.length) { 
      doStuff(); 
     } 
    } 
    for(var i = 0; i < varNames.length; i++) { 
     db.get(varNames[i], function(val) { 
      if(isGood(val, conditions[i]) { 
       checker(); 
      } 
     }); 
    } 
} 

Mais cela ne semble pas fonctionner non plus. Des idées?

+0

Voir (http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an- [Comment retourner la réponse d'un appel AJAX?] ajax-call) pour des idées. tl; dr: Utilise les promesses. –

+0

Vos déclarations de fonction doivent être préfixées avec 'function', sinon vous obtiendrez une erreur de syntaxe. – levi

Répondre

0

Vous pouvez effectuer les appels de base de données un à la fois et utiliser le rappel de succès pour passer l'appel DB suivant. Quelque chose comme ceci:

function myFunc(varNames, conditions){ 
    if(varNames.length){ 
     var name = varNames.shift(), 
      condition = conditions.shift(); 
     db.get(name, function(val){ 
      if(isGood(val, condition)){ 
       myFunc(varNames, conditions); 
      } 
     }); 
    } else { 
     doStuff(); 
    } 
} 
Questions connexes