2017-07-15 24 views
1

ログファイルをストリーミングしていて、特定のログエントリがキャプチャされたとき(これらのイベント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); 
     }) 
} 

})以下の実際の問題のコードは

答えて

1

インデックスDBは、スコープが重複する「読み書き」トランザクションを以下のスケジュール「読み取り専用」取引がされるまで実行されないであろうことを要求します"readwrite"トランザクションが完了し、書き込みの結果が表示されます。はい、あなたの期待は正しいです。

そう...可能性がある:

  • あなたは(あなたはこのスタンドアロン再現できるブラウザ?)バギー実装を扱っているトランザクションが順番に開始されていない
  • あなたは期待しています。 db.transaction通話をログに記録し、注文を確認できますか? (つまり、dbPromise.thenハンドラーが期待どおりの順序で実行されていない可能性があります)
  • 他のロジックエラーがあります。キーが間違っているため値が表示されません

これらのどれを絞り込むことができますか?

+0

この場合、オプション2でした。私のaddEntry関数とは関係ありませんでした。第一の読み取り関数が解決されてその読み込みトランザクションがスケジュールされる前に、第二の読み取り関数がスケジュールされていたという事実とは関係ありませんでした。 – Bruford

関連する問題