gpt4 book ai didi

javascript - IndexedDB 的 JayData saveChanges() 错误

转载 作者:行者123 更新时间:2023-11-30 13:04:52 24 4
gpt4 key购买 nike

我在从 IndexedDb 中删除数据时遇到问题。这些方法在 WebSql 上运行良好,但在 IndexedDb 上会引发错误。初始种群似乎工作正常。

这个错误是在 Chrome 中:

Uncaught TypeError: Cannot read property 'ABORT_ERR' of undefined IndexedDbProvider.js:627
self.db.transaction.setCallbacks.onerror

代码已移至jsFiddle here

值得注意的是,如果我简单地调用 remove() 就没有错误。该错误似乎仅在我尝试 saveChanges() 时发生。

看到我(可能)引起您的注意是 toArrayforEach 同步吗?这样我就可以减少保存的交易?

最佳答案

dvContext.Data.remove(data) 只是一个错字?应该是 dContext.Datas.remove(data);

JayData 的一些函数是同步的,其他方法是异步的,但以合乎逻辑的方式:)当 JayData 访问本地数据库或通过网络调用远程方法时,这些函数是异步的。让我们检查一下您的代码:

 dContext.Datas

是一个过滤器(可查询),它会选择所有记录,只要您只构建过滤器,调用就会同步,所以

dContext.Datas.filter().take().skip().orderBy().map()

只是在内存中建立过滤器,什么都不做,所以它们都是同步的,然后:

dContext.Datas.toArray()

toArray 触发真正的 Action ,执行查询,这里我们必须接触本地数据库,所以它是异步的,当它完成时它可以调用回调函数或解析它之前返回的 promise 。

这同样适用于删除,它只是将记录放入一个集合中(因此它是同步的)并且 saveChanges() 完成真正的工作(它是异步的)。

恕我直言,你的问题是你的 toArray 有一个回调函数和一个 then 分支,所以两者都将被并行调用,而 then 分支不会等待回调完成。解决方案:

dContext.Datas.toArray()
.then(function(data) {
// your removes in a loop
// important: return the promise
return dContext.saveChanges();
})
.then(function() {
// whatever
})

关于javascript - IndexedDB 的 JayData saveChanges() 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16054171/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com