1

我无法从 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所以我可以减少保存交易?

4

1 回答 1

3

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

JayData 的一些函数是同步的,而其他方法是异步的,但以一种合乎逻辑的方式 :) 当 JayData 接触本地数据库或通过网络调用远程方法时,这些函数是异步的。让我们看看你的代码:

 dContext.Datas

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

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

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

dContext.Datas.toArray()

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

这同样适用于删除,它只是将记录放入一个集合中(因此它是同步的),而 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
})
于 2013-04-17T08:46:46.330 回答