ログファイルをストリーミングしていて、特定のログエントリがキャプチャされたとき(これらのイベントAと呼ばせてください)、IndexedDBに書き込みます。別の特定のログエントリがキャプチャされると(たとえばイベントB)、オブジェクトストアで一致するイベントAエントリを検索します。書き込みが完了する前にIndexedDBの読み取りが完了しました
イベントAとイベントBが連続して発生しない限り、正常に動作します。連続して発生する場合(イベントAがログファイルに書き込まれ、その後すぐにイベントBが書き込まれるとします)、イベントAのエントリは見つかりません。
"readwrite"モードでイベントAを読み込もうとしましたが、うまくいきませんでした。これは予期せぬことですが、readwriteで開くと、イベントAが完了するまでトランザクションを実行しようとしませんでした。
私が考えている解決策の1つは、各トランザクションを追跡し、すべてのトランザクションが完了している場合にのみ検索を開始することです - しかし、私が想像していることはかなり一般的です。
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
}
};
})
})
}
EDIT:
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関数とは関係ありませんでした。第一の読み取り関数が解決されてその読み込みトランザクションがスケジュールされる前に、第二の読み取り関数がスケジュールされていたという事実とは関係ありませんでした。 – Bruford