indexedDB先添加后获取的良好实践

3vpjnl9f  于 2023-02-06  发布在  IndexedDB
关注(0)|答案(1)|浏览(205)

下面的代码在indexedDB对象存储中插入了一个todo对象,然后获得了存储对象的副本(见下文),这很好用。
我担心我正在重用一个使用起来可能不安全的事务--因为该事务已经成功了。
我应该为get创建另一个事务吗--或者这是不必要的?

// this is only called after the 'tasks' object store has been opened
    const todoIDB = requestIDB.result
    const transaction = todoIDB.transaction(["tasks"], "readwrite")
    const todoStore = transaction.objectStore("tasks")
    const addRequest = todoStore.add({text:txt_val})
    addRequest.addEventListener("success", ()=>{
      console.log("Added " + "#" + addRequest.result + ": " + txt_val)
      // should I add a new transaction, etc. here?
      const getRequest = todoStore.get(addRequest.result)
      getRequest.addEventListener("success", ()=>{
        console.log("Found " + JSON.stringify(getRequest.result))
      })
    })

以下是一些(有效的)输出(来自Chrome):

Added #18: aaa
Found {"text":"aaa","id":18}
Added #19: bbb
Found {"text":"bbb","id":19}
uqxowvwt

uqxowvwt1#

事务可以跨越多个请求,所以这是很好的(当然,如果add请求失败--例如记录已经存在--那么“success”不会触发get请求)。
为了澄清一点--当你观察“成功”事件时,成功的是 * 请求 *,而不是 * 事务 *。当整个事务完成时,即当所有单独的请求都成功或一个请求失败并导致事务失败时,“完成”或“中止”事件将在事务对象上触发。

相关问题