带有IndexedDB的JayData saveChanges()错误

时间:2013-04-17 07:32:59

标签: javascript indexeddb jaydata

我在从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是否同步?所以我可以减少保存的交易吗?

1 个答案:

答案 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
})