与indexeddb问题异步

时间:2015-12-28 12:27:20

标签: asynchronous indexeddb

我在IndexedDB中遇到问题,我需要更改某些会议的状态。搜索功能通过抓取每个会议的ID来检查哪些会议,在我A for()之后不久我回溯了包含每个数据库访问的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);
      };
    };
  }

在我看来,问题是由于银行indexeddb异步,它传递到下一次搜索,甚至在第一次停止之前。 但是我怎么做呢? 在这种情况下,某些事情的良好做法是什么?。

1 个答案:

答案 0 :(得分:0)

  1. 如果您对编写异步代码缺乏经验,那么要考虑的一个好的一般规则就是永远不要在循环中定义函数。请勿在for循环中将request.onsuccess设置为函数。

  2. 当您不希望单个请求因数据相关原因(例如违反索引的唯一性约束)或因为您是因为某些事务而失败时,您可以对同一事务执行多个get和put请求在同一笔交易中执行数千条请求并达到处理限制。

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

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

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

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