Asynchronous 带有indexeddb问题的异步

Asynchronous 带有indexeddb问题的异步,asynchronous,indexeddb,Asynchronous,Indexeddb,我对IndexedDB中的一个函数有问题,我需要更改某些会议的状态。搜索功能,即在I Afor()之后不久,通过抓取每个会议的ID来检查会议,其中我回溯包含每个数据库访问ID的向量时,会得到不同的时间ID。下面的代码示例: var val = []; var checkbox = $('input:checkbox[class^=checkReunioes]:checked'); if(checkbox.length > 0){ checkbox.each(fu

我对IndexedDB中的一个函数有问题,我需要更改某些会议的状态。搜索功能,即在I A
for()
之后不久,通过抓取每个会议的ID来检查会议,其中我回溯包含每个数据库访问ID的向量时,会得到不同的时间ID。下面的代码示例:

      var val = [];
  var checkbox = $('input:checkbox[class^=checkReunioes]:checked');
  if(checkbox.length > 0){
    checkbox.each(function(){
      val.push($(this).val());
    });
  }

  for(var i = 0; i < val.length; i++){
    var transaction = db.transaction(["tbl_REUNIOES"], "readwrite").objectStore("tbl_REUNIOES");
    var request = transaction.get(val[i]);
    request.onerror = function(event) {
      alert("BAD");
    };
    request.onsuccess = function(event) {

      var data = request.result;

      data.FLG_STATU_REUNI = 'I';

      var codigo_igreja = localStorage.getItem("igreja");
      var dataJSON = JSON.stringify(data);
      enviarFilaSincronismo("tbl_REUNIOES", "U", dataJSON, " WHERE COD_IDENT_REUNI = '" + val[i] + "' and COD_IDENT_IGREJ = '" + codigo_igreja + "'");

      var requestUpdate = transaction.put(data);
      requestUpdate.onerror = function(event) {
        alert("OK");
      };
      requestUpdate.onsuccess = function(event) {
        $("#listReunioes").html("");
        serchAll(w_key_celula);
      };
    };
  }
var val=[];
var checkbox=$('input:checkbox[class^=checkreunions]:checked');
如果(checkbox.length>0){
复选框。每个(函数(){
val.push($(this.val());
});
}
对于(变量i=0;i
在我看来,问题的发生是由于银行indexeddb异步,它会传递到下一次搜索,甚至在第一次停止之前。 但我该怎么做才能达成这个协议呢? 在这种情况下,什么是好的做法

>P>如果你对编写异步代码缺乏经验,一个很好的一般规则是永远不要在循环内定义函数。不要从for循环中将request.onsuccess设置为函数

  • 如果您不希望单个请求因数据相关的原因而失败,例如违反索引的唯一性约束,或者在同一事务上执行数千个请求并达到处理限制,则可以对同一事务执行多个get和put请求

  • 您可能会发现,将IDBObjectStore.prototype.openCursor与IDBCursor.prototype.update一起使用比使用IDBObjectStore.prototype.get和IDBObjectStore.prototype.put更方便

  • 您的示例代码表明,成功的get请求意味着检索到了数据,而事实上,实际情况并非如此。成功的get请求只意味着请求发生时没有错误(例如,针对存在的对象存储、针对未被其他请求阻止的数据库、针对仍然有效的数据库连接)。这并不意味着对象与get请求查询匹配。您应该检查请求的结果对象是否已定义,并使用该检查确定对象是否与get查询匹配,而不仅仅是确定请求是否成功

  • 您可能希望花更多的时间将代码组织成更小的函数,使用更清晰的名称。您的示例代码很难阅读

  • 看起来您正在使用某种类型的全局db变量。如果您没有编写异步代码的丰富经验,请避免使用全局db变量。无法保证在您决定访问db变量时会定义并打开它,这可能会导致意外错误


  • 事实上,问题出现在第3点和第4点中,其余部分被确认功能正常,如果其响应表明有正确的方法来完成该过程?试图在编程前保持代码的最大值?