2017-07-15 53 views
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); 
     }) 
} 

})實際問題的代碼

回答

1

索引數據庫要求具有重疊範圍遵循「讀寫」交易「只讀」的交易計劃將無法運行,直到「readwrite」事務已完成,因此會看到寫入的結果。所以是的,你的期望是正確的。

所以...的可能性是:

  • 你正在處理一個越野車實現(你可以重現這個獨立的哪一種瀏覽器?)
  • 的交易不是在訂單開始你期望;您是否可以登錄db.transaction電話並驗證訂單? (即也許dbPromise.then處理程序沒有在運行的順序你期望)
  • 有一些其他的邏輯誤差,例如關鍵是不正確的,所以價值是看不到的

你能縮小這是哪一個?

+0

在這種情況下是選項2。這與我的addEntry函數無關,與第二個讀取函數在第一個讀取函數解析並調度其readwrite事務之前安排的事情無關。 – Bruford