로그 파일을 스트리밍하고 특정 로그 항목이 캡처되면 (이 이벤트 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에서는 범위가 겹치는 "읽기 쓰기"트랜잭션 이후에 예약 된 "읽기 전용"트랜잭션이 "읽기 쓰기"트랜잭션이 완료 될 때까지 실행되지 않으므로 쓰기 결과를 볼 수 있어야합니다. 네, 당신의 기대는 맞습니다.
그래서 ... 가능성은 다음과 같습니다.
db.transaction
통화 를 기록 하고 주문을 확인할 수 있습니까? (예 : dbPromise.then
핸들러가 예상 한 순서대로 실행되지 않을 수 있음)이것들 중 어느 것을 좁힐 수 있습니까?
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다