未捕获的 DOMException:无法在“IDBObjectStore”上执行“删除”:事务未处于活动状态

Posted

技术标签:

【中文标题】未捕获的 DOMException:无法在“IDBObjectStore”上执行“删除”:事务未处于活动状态【英文标题】:Uncaught DOMException: Failed to execute 'delete' on 'IDBObjectStore': The transaction is not active 【发布时间】:2020-06-26 02:34:50 【问题描述】:

当我尝试将我的 tensorflowjs 模型保存在 IndexedDb 中时出现此错误。基本上我正在开发一个可以实时预测情绪的离线网络应用程序。为了让我的应用程序更快,我必须使用 Indexed Db。前端在 Reactjs 中。 错误出现在这一行:

await this.model.save('indexeddb://' + INDEXEDDB_KEY);

这是代码。

  try 
    this.model = await tf.loadLayersModel('indexeddb://' + INDEXEDDB_KEY);

    // Safe to assume tensorflowjs database and related object store exists.
    // Get the date when the model was saved.
    try 
      const db = await openDB(INDEXEDDB_DB, 1, );
      const item = await db.transaction(INDEXEDDB_STORE)
                           .objectStore(INDEXEDDB_STORE)
                           .get(INDEXEDDB_KEY);
      const dateSaved = new Date(item.modelArtifactsInfo.dateSaved);
      await this.getModelInfo();
      console.log(this.modelLastUpdated);
      if (!this.modelLastUpdated  || dateSaved >= new Date(this.modelLastUpdated).getTime()) 
        console.log('Using saved model');
      
      else 
        this.setState(
          modelUpdateAvailable: true,
          showModelUpdateAlert: true,
        );
      

    
    catch (error) 
      console.warn(error);
      console.warn('Could not retrieve when model was saved.');
    

  
  // If error here, assume that the object store doesn't exist and the model currently isn't
  // saved in IndexedDB.
  catch (error) 
    console.log('Not found in IndexedDB. Loading and saving...');
    console.log(error);

    this.model = await tf.loadLayersModel(MODEL_PATH);
    console.log(this.model,"model")
    await this.model.save('indexeddb://' + INDEXEDDB_KEY);
  

// If no IndexedDB, then just download like normal.
else 
  console.warn('IndexedDB not supported.');
  this.model = await tf.loadLayersModel(MODEL_PATH);


this.setState( modelLoaded: true );


// Warm up model.
// let prediction = tf.tidy(() => this.model.predict(tf.zeros([1, IMAGE_SIZE, IMAGE_SIZE, 3])));
// prediction.dispose();

'''

【问题讨论】:

【参考方案1】:

如果没有待处理的请求,则事务关闭。看起来你的等待正在做一些非索引数据库的事情,所以很自然,因为你没有立即将事务中的一些请求排队,它会关闭,然后当你最终在事务上请求某些东西时,它就会被关闭时间(非活动)。

在您完成其他异步操作后开始您的事务。不要在开始事务和向其添加请求之间执行异步操作。

【讨论】:

以上是关于未捕获的 DOMException:无法在“IDBObjectStore”上执行“删除”:事务未处于活动状态的主要内容,如果未能解决你的问题,请参考以下文章

未捕获的 DOMException:无法读取“cssRules”属性

未捕获的 DOMException:无法在“IDBObjectStore”上执行“删除”:事务未处于活动状态

未捕获的 DOMException:无法使用 JQuery 设置“innerHTML”属性

未捕获的 DOMException:无法在“CustomElementRegistry”上执行“定义”:此名称已用于此注册表

iframe chrome:未捕获的 DOMException:无法从“Window”读取“localStorage”属性:此文档的访问被拒绝

如何处理未捕获(承诺)DOMException:播放()请求被暂停()调用中断