2014-05-01 209 views
0

我需要从IndexedDB中检索多个值,检查它们是否都满足某些约束(对于所有这些约束都不相同),如果是这样,则调用一个函数。为了更好地说明这一点,设想对IndexedDB的调用是同步的,我们会有类似的东西。检查从索引数据库异步检索的几个值

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

由于IndexedDB是异步的,我不知道该怎么做。因为doStuff的调用取决于所有获取,所以在每次获取中使用回调并不可行。将结果累积到全局变量中将不起作用,因为myFunc被称为多个变量。我试过类似的东西:

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

但这似乎并不奏效。有任何想法吗?

+0

见(http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an- [如何返回从AJAX调用的响应?] ajax-call)的想法。 tl; dr:使用承诺。 –

+0

你的函数声明必须以'function'作为前缀,否则你会得到一个语法错误。 – levi

回答

0

您可以使数据库一次调用一个,并使用成功回调进行下一次数据库调用。事情是这样的:

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