我有麻烦从IndexedDb删除数据。这些方法在WebSql中工作得很好,但在IndexedDb中抛出错误。初始人口似乎工作得不错。
这个错误是在Chrome浏览器:
Uncaught TypeError: Cannot read property 'ABORT_ERR' of undefined IndexedDbProvider.js:627
self.db.transaction.setCallbacks.onerror
代码已经移动到jsFiddle这里
值得注意的是,如果我简单地调用remove()
,没有错误。这个错误似乎只发生在我尝试saveChanges()
的时候。
鉴于我(潜在地)引起了你的注意,toArray
和forEach
是同步的吗?这样我就可以减少交易了?
dvContext.Data.remove(data)只是一个错字?应该是dcontext . data .remove(data);
JayData的一些功能是同步的,其他方法是异步的,但在一个逻辑的方式:)当JayData接触本地数据库或通过网络调用远程方法时,这些函数是异步的。让我们检查一下代码:
dContext.Datas
是一个过滤器(可查询的),它选择所有的记录,只要你只是建立过滤器调用是同步的,所以
dContext.Datas.filter().take().skip().orderBy().map()
只是在内存中建立过滤器,不做任何其他事情,所以它们都是同步的,然后:
dContext.Datas.toArray()
toArray触发实际的动作,执行查询,这里我们必须触摸本地数据库,所以它是异步的,当它完成时,它可以调用回调函数或解析它之前返回的承诺。
同样适用于remove,它只是把记录放到一个集合中(所以它是同步的),saveChanges()做真正的工作(它是异步的)。
你的问题是你的toArray有一个回调函数和一个然后分支,所以两者都将被并行调用,然后分支将不会等待回调完成。解决方案:
dContext.Datas.toArray()
.then(function(data) {
// your removes in a loop
// important: return the promise
return dContext.saveChanges();
})
.then(function() {
// whatever
})