1
之前我流日誌文件,當某個日誌條目被捕獲(我們稱這些事件A)我把它們寫到IndexedDB的。當另一個特定的日誌條目被捕獲(比如說,事件B)時,我搜索對象存儲以查找匹配的事件A條目。IndexedDB的讀取完成寫入完成
這隻要事件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);
})
}
})實際問題的代碼
在這種情況下是選項2。這與我的addEntry函數無關,與第二個讀取函數在第一個讀取函數解析並調度其readwrite事務之前安排的事情無關。 – Bruford