我在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异步,它传递到下一次搜索,甚至在第一次停止之前。 但是我怎么做呢? 在这种情况下,某些事情的良好做法是什么?。
答案 0 :(得分:0)
如果您对编写异步代码缺乏经验,那么要考虑的一个好的一般规则就是永远不要在循环中定义函数。请勿在for循环中将request.onsuccess设置为函数。
当您不希望单个请求因数据相关原因(例如违反索引的唯一性约束)或因为您是因为某些事务而失败时,您可以对同一事务执行多个get和put请求在同一笔交易中执行数千条请求并达到处理限制。
您可能会发现将IDBObjectStore.prototype.openCursor与IDBCursor.prototype.update一起使用比使用IDBObjectStore.prototype.get和IDBObjectStore.prototype.put更方便。
您的示例代码表明成功获取请求意味着检索到数据,而事实上,这并不是实际发生的事情。成功的获取请求仅意味着发生了没有错误的请求(例如,针对未被其他请求阻止的数据库存在的对象存储,针对仍然有效的数据库连接)。 不意味着对象与您的获取请求查询匹配。您应检查请求的结果对象是否已定义,并使用该检查确定对象是否与您的获取查询匹配,而不仅仅是成功请求发生。
您可能希望花更多时间将代码组织成使用更清晰名称的较小函数。您的示例代码很难阅读。
看起来您正在使用某种类型的全局db变量。如果您没有编写异步代码的经验,请避免使用全局db变量。当您决定访问db变量时,无法保证定义和打开db变量,这可能会导致意外错误。