JayData saveChanges()使用IndexedDB时出错



我有麻烦从IndexedDb删除数据。这些方法在WebSql中工作得很好,但在IndexedDb中抛出错误。初始人口似乎工作得不错。

这个错误是在Chrome浏览器:

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

代码已经移动到jsFiddle这里

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

鉴于我(潜在地)引起了你的注意,toArrayforEach是同步的吗?这样我就可以减少交易了?

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

相关内容

  • 没有找到相关文章

最新更新