我在从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()
时,错误似乎完全发生。
看到我(可能)引起注意的是toArray
和forEach
是否同步?所以我可以减少保存的交易吗?
答案 0 :(得分:3)
dvContext.Data.remove(data)只是一个错字?应该是dContext.Datas.remove(data);
JayData的一些函数是同步的,其他方法是异步的,但逻辑方式是:) 当JayData触摸本地数据库或通过网络调用远程方法时,这些函数是异步的。我们来看看你的代码:
dContext.Datas
是一个过滤器(Queryable),它选择所有记录,只要您构建过滤器,调用是同步的,所以
dContext.Datas.filter().take().skip().orderBy().map()
只是在内存中构建过滤器,不执行任何其他操作,因此它们都是同步的,然后:
dContext.Datas.toArray()
toArray触发实际动作,执行查询,这里我们必须触摸本地数据库,因此它是异步的,当它完成时它可以调用回调函数或解析它之前返回的承诺。
同样适用于删除,它只是将记录放入一个集合(因此它是同步的),而saveChanges()完成了真正的工作(它是异步的)。
你的问题是你的toArray有一个回调函数和一个then分支,所以两者都将被称为并行,然后分支将不会等待回调的结束。解决方案:
dContext.Datas.toArray()
.then(function(data) {
// your removes in a loop
// important: return the promise
return dContext.saveChanges();
})
.then(function() {
// whatever
})