Javascript indexeddb游标内的异步操作

Javascript indexeddb游标内的异步操作,javascript,asynchronous,promise,indexeddb,Javascript,Asynchronous,Promise,Indexeddb,我正在使用indexedDBpromisted库将indexeddbapi转换为promissions 看起来在我的提取完成时,我的索引数据库事务不再处于活动状态。我猜这是超时了 我得到的错误是: DOMException:未能对“IDBCursor”执行“delete”:事务已完成。 我试图完成的是从indexedDB中删除该项,并且仅当获取成功完成时。我知道我可以在获取后创建第二个事务来获取项目并将其删除。但我想知道是否有更好的方式不进行新的交易?我错过什么了吗 有人能解释一下我为什么会看到

我正在使用indexedDBpromisted库将indexeddbapi转换为promissions

看起来在我的提取完成时,我的索引数据库事务不再处于活动状态。我猜这是超时了

我得到的错误是:

DOMException:未能对“IDBCursor”执行“delete”:事务已完成。

我试图完成的是从
indexedDB
中删除该项,并且仅当获取成功完成时。我知道我可以在获取后创建第二个事务来获取项目并将其删除。但我想知道是否有更好的方式不进行新的交易?我错过什么了吗

有人能解释一下我为什么会看到这个问题吗

DBHelper.DBPromised.then( db => {
  const store = db.transaction('deferredReviews', 'readwrite').objectStore('deferredReviews');
  const submittedRes = {};
  store.openCursor()
    .then(function submitAndDelete(cursor) {
        if (!cursor) return;
        console.log(cursor.value);

        fetch(`${DBHelper.DATABASE_URL}/reviews`, {
          method: 'POST',
          body: JSON.stringify({
            restaurant_id: cursor.value.restaurant_id,
            name: cursor.value.name,
            createdAt: cursor.value.deferredAt,
            rating: cursor.value.rating,
            comments: cursor.value.comments
          })
        })
        .then(response => {
          if (!response.ok) {
            throw Error(response.statusText);
          }
          return response.json();
        })
        // If response is ok then delete from indexedDB.
        .then(review => {
          if (!review) return new Error('Could not submit');
          if (cursor.value.restaurant_name in submittedRes) {
            submittedRes[cursor.value.restaurant_name] = submittedRes[cursor.value.restaurant_name] + 1;
          } else {
            submittedRes[cursor.value.restaurant_name] = 1;
          }
          cursor.delete();
          return cursor.continue().then(submitAndDelete);
        });
    })
    .then(() => {
      if (Object.keys(submittedRes).length === 0 && submittedRes.constructor === Object) return;
        DBHelper.showDeferredSubmitModal(submittedRes);
    });
});

您不能在索引XDB操作的中间执行异步操作。如果IDB事务在到达JavaScript事件循环的当前迭代结束时未检测到任何挂起的请求,它将自动超时。异步操作会引入暂停,因此暂停后绑定的后续请求绑定得太晚,因为此时事务超时并结束。事务的寿命很短,因为读写模式事务可能会在对象存储的整个期间锁定对象存储,从而导致严重的阻塞问题


为了解决这个问题,在事务之前或之后都要执行所有的异步操作,而不是在中间操作。或者,如果数据完整性不是问题,则使用两个单独的事务。

不是您的问题,而是
submittedRes.constructor===Object
永远不可能是真的。如果您是对的,我将其更改为
obj instanceof Object
。谢谢你的建议