쓰기가 완료되기 전에 IndexedDB 읽기 완료

Bruford

로그 파일을 스트리밍하고 특정 로그 항목이 캡처되면 (이 이벤트 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

특정 기능이 완료되기 전에 OnComplete 실행 (Javascript / IndexedDB)

분류에서Dev

C # 비동기 작업이 완료되기 전에 완료 됨

분류에서Dev

완료 전에 완료 처리기 True

분류에서Dev

작업이 완료되기 전에 NodeJS 비동기가 완료 됨

분류에서Dev

Firebasequery가 완료되기 전에 Android 비동기 작업이 완료 됨

분류에서Dev

쿼리가 완료되기 전에 완료된 Big Query 작업 상태

분류에서Dev

Cloud Function에서 쓰기가 완료되면 값 업데이트

분류에서Dev

작업이 완료되기 전에 반환되는 완료 핸들러

분류에서Dev

모든 작업이 완료되기 전에 ThreadPoolExecutor 종료

분류에서Dev

iprocess가 완료되기 전에 대기가 계속됩니다.

분류에서Dev

콜백이 완료되기 전에 자바 스크립트 함수 완료

분류에서Dev

쿼리가 완료되기 전에 응답 보내기

분류에서Dev

읽기 전용 복제본 생성 작업이 완료되고 완료되었는지 확인하는 방법

분류에서Dev

읽기 전용 복제본 생성 작업이 완료되고 완료되었는지 확인하는 방법

분류에서Dev

VBA가 완료되기 전에 중지됩니다.

분류에서Dev

컨트롤러가 완료되기 전에 angularjs 뷰로드

분류에서Dev

미래 완료되기 전에 돌아 오는 기능

분류에서Dev

작업이 완료되기 전에 WPF 창 닫기

분류에서Dev

완료되기 전에`at` 출력 살펴보기

분류에서Dev

NodeJS는 기능이 완료되기 전에 응답합니다.

분류에서Dev

잘 실행되지만 완료되기 전에 충돌

분류에서Dev

소스 Observable이 완료되기 전에`merge` 연산자가 완료되는 이유는 무엇입니까?

분류에서Dev

방법 이전에 기록되지 DB에 JPA 변경 완료

분류에서Dev

이벤트가 완료되기 전에 jQuery 애니메이션 완료가 실행됩니다.

분류에서Dev

Git-Flow-릴리스가 완료되기 전에 새 기능 만들기

분류에서Dev

Realm 쓰기가 완료되기를 기다리는 중

분류에서Dev

Cloudformation 템플릿은 UserData가 완료되기 전에 배포를 완료합니다.

분류에서Dev

앱이 시작되기 전에 완료 핸들러 수행

분류에서Dev

q. 약속이 완료되기 전에 모두 반환 됨

Related 관련 기사

  1. 1

    특정 기능이 완료되기 전에 OnComplete 실행 (Javascript / IndexedDB)

  2. 2

    C # 비동기 작업이 완료되기 전에 완료 됨

  3. 3

    완료 전에 완료 처리기 True

  4. 4

    작업이 완료되기 전에 NodeJS 비동기가 완료 됨

  5. 5

    Firebasequery가 완료되기 전에 Android 비동기 작업이 완료 됨

  6. 6

    쿼리가 완료되기 전에 완료된 Big Query 작업 상태

  7. 7

    Cloud Function에서 쓰기가 완료되면 값 업데이트

  8. 8

    작업이 완료되기 전에 반환되는 완료 핸들러

  9. 9

    모든 작업이 완료되기 전에 ThreadPoolExecutor 종료

  10. 10

    iprocess가 완료되기 전에 대기가 계속됩니다.

  11. 11

    콜백이 완료되기 전에 자바 스크립트 함수 완료

  12. 12

    쿼리가 완료되기 전에 응답 보내기

  13. 13

    읽기 전용 복제본 생성 작업이 완료되고 완료되었는지 확인하는 방법

  14. 14

    읽기 전용 복제본 생성 작업이 완료되고 완료되었는지 확인하는 방법

  15. 15

    VBA가 완료되기 전에 중지됩니다.

  16. 16

    컨트롤러가 완료되기 전에 angularjs 뷰로드

  17. 17

    미래 완료되기 전에 돌아 오는 기능

  18. 18

    작업이 완료되기 전에 WPF 창 닫기

  19. 19

    완료되기 전에`at` 출력 살펴보기

  20. 20

    NodeJS는 기능이 완료되기 전에 응답합니다.

  21. 21

    잘 실행되지만 완료되기 전에 충돌

  22. 22

    소스 Observable이 완료되기 전에`merge` 연산자가 완료되는 이유는 무엇입니까?

  23. 23

    방법 이전에 기록되지 DB에 JPA 변경 완료

  24. 24

    이벤트가 완료되기 전에 jQuery 애니메이션 완료가 실행됩니다.

  25. 25

    Git-Flow-릴리스가 완료되기 전에 새 기능 만들기

  26. 26

    Realm 쓰기가 완료되기를 기다리는 중

  27. 27

    Cloudformation 템플릿은 UserData가 완료되기 전에 배포를 완료합니다.

  28. 28

    앱이 시작되기 전에 완료 핸들러 수행

  29. 29

    q. 약속이 완료되기 전에 모두 반환 됨

뜨겁다태그

보관