2017-07-15 75 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