2015-12-28 58 views
0

我在IndexedDB中的函数有问题,我需要更改某些会议的状态。搜索功能哪些会议通过获取每个会员的ID来检查,​​在我回溯包含每个数据库访问的ID的向量后,我是否会获得不同的时间ID。下面的代码示例:与indexeddb问题异步

 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的异步,把它传递给下一个搜索,甚至连第一站前。 但我该怎么做才能赋予它呢? 在这种情况下,最好的做法是什么?

回答

0
  1. 如果你对编写异步代码不熟悉,一个好的通用规则是不要在循环内定义函数。请勿在for循环中将request.onsuccess设置为函数。

  2. 如果您不希望单个请求由于数据相关的原因而失败,例如违反索引的唯一性约束,或者您正在执行的操作,则可以对同一事务执行多个获取和放入请求成千上万的同一交易请求并达到处理限制。

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

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

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

  6. 它看起来像你正在使用某种类型的全局数据库变量。如果您在编写异步代码方面经验不足,请避免使用全局数据库变量。无法保证数据库变量将在您决定访问时定义和打开,这可能会导致意外错误。

+0

实际上在第3点和第4点发现了问题,其余的问题被证实是完美运行的,将会有响应表明正确的方法来完成该过程?试图在编程之前保持最大的代码? –