gpt4 book ai didi

javascript - IndexedDB 读取在写入完成之前完成

转载 作者:行者123 更新时间:2023-12-03 03:52:04 24 4
gpt4 key购买 nike

我正在流式传输日志文件,当捕获某个日志条目时(我们将其称为事件 A),我将它们写入 IndexedDB。当捕获另一个特定日志条目(例如事件 B)时,我会在对象存储中搜索匹配的事件 A 条目。

只要事件 A 和事件 B 不连续发生,这种方法就可以正常工作。如果它们连续发生(假设事件 A 写入日志文件,然后事件 B 立即写入),则找不到事件 A 中的条目。

我尝试以“读写”模式读取事件 A,但这不起作用 - 这是出乎意料的,因为我认为以读写方式打开意味着在事件 A 完成之前它不会尝试运行事务。

我正在考虑实现的一个解决方案是跟踪每笔交易,并且仅在所有交易完成时才启动搜索 - 但对于我认为相当常见的事情似乎需要付出很大的努力?

addEntry(store: string, entry: any): Promise<boolean> {
return new Promise<boolean>((resolve, reject) => {
this.dbPromise.then(db => {
let transaction = db.transaction(store, "readwrite");

transaction.oncomplete = (evt: any) => {
resolve(true);
}

transaction.onerror = (err: any) => {
this.logger.error({
originalError: err,
message: 'transaction error',
data: {
store,
entry
}
});
reject(err);
}

transaction.onabort = (evt: any) => {
this.logger.error({
originalError: evt,
message: 'transaction aborted',
data: {
store,
entry
}
})
reject(evt);
}

let objectStore = transaction.objectStore(store);

let request = objectStore.add(entry);

request.onerror = (err) => {
console.dir(err);
}
})
.catch(err=>{
this.logger.error({
originalError: err,
message: 'journalDBService.addEntry error',
data: {
store,
entry
}
});
})
})
}

getEntry(store: string, key:any): Promise<any> {
return new Promise<any>((resolve,reject)=>{
this.dbPromise.then(db=>{
let transaction = db.transaction(store, "readonly");
let objectStore = transaction.objectStore(store);
let request = objectStore.get(key)

request.onsuccess = (evt) => {
resolve((<IDBRequest>evt.target).result);
}

request.onerror = (err) => {
this.logger.error({
originalError: err,
message: 'journalDBService.getEntry request error',
data: {
store,
key
}
});
}
})
.catch(err=>{
let report = {
originalError: err,
message: 'journalDBService.addEntry error',
data: {
store,
key
}
};
})
})
}

编辑:下面的实际违规代码

this.journalDB.getEntry(journal.JournalEvents.missionAccepted, (<journal.MissionAccepted>data).MissionID).then(result => {
if (!result) {
this.journalDB.addEntry(journal.JournalEvents.missionAccepted, data)
.catch(err => {
let report = {
originalError: err,
message: 'journalService.handleEvent error',
data
}
this.logger.error(report);
})
}

})

最佳答案

索引数据库要求在具有重叠范围的“读写”事务之后安排的“只读”事务在“读写”事务完成之前不会运行,从而可以看到写入的结果。所以是的,您的期望是正确的。

所以...可能性是:

  • 您正在处理一个有缺陷的实现(哪个浏览器?您可以独立重现这个吗?)
  • 交易未按您期望的顺序开始;您能够记录 db.transaction 调用并验证订单吗? (即,dbPromise.then 处理程序可能未按您期望的顺序运行)
  • 还有一些其他逻辑错误,例如键不正确,因此看不到值

你能缩小范围是其中哪一个吗?

关于javascript - IndexedDB 读取在写入完成之前完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45119364/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com