之前用localStorage,但是它有容量限制,现在切换成indexedDb但是看看之前的代码,要改好多,原因就是本来一句话搞点的获取数据:varmodulesJson=store.getStore(curStoreModule);现在要写这么长:idb.get(this.curStore).then(res=>{console.info('task....',res);if(typeof(res)!='undefined')this.jobTask=res.json;if(this.curUser.DomainId!=0)this.jobTask.DomainId=this.curUser.DomainId;});而且必须是异步的,我无法直接通过一个方法返回数据,而且在then里面没办法返回获取的数据,那是不是所有的逻辑都要写在then里了。还有如果同时获取多个数据,这个就更麻烦了,我现在开始怀疑这个异步API设计的是不是有问题。用起来好麻烦。是我用法不对还是怎么滴。求大佬们帮助,能不能写个方法,直接能返回数据的,不要那个Promise返回。。。谢谢
2 回答
UYOU
TA贡献1878条经验 获得超4个赞
IndexedDB的作者把异步用的过度了。之前的版本是有同步访问功能的,后来他去掉了,后来又说如果将来有必要,可以再加回来。在我看来,数据库访问至少在80%的情况下应该是同步的,必须等待结果,把它做成异步,会给应用层带来很大麻烦。但是他现在既然已经这样了,我们也只能忍着。如果你的代码可以用es7语法中的async/await方法的话,可以改成下面这样:asyncfunctiongetAllData(){letdb=awaitidb.open('db-name',1)lettx=db.transaction('objectStoreName','readonly')letstore=tx.objectStore('objectStoreName')letallSavedItems=awaitstore.getAll()console.log(allSavedItems)db.close()}这样至少从代码表面看起来实现了一个伪同步的效果。如果需要用在浏览器里的话,需要用babel把它转成es5的语法。
函数式编程
TA贡献1807条经验 获得超9个赞
推荐使用localForage库,可以使用很简洁的方法操作IndexedDB、WebSQL或localStorage。localforage.setItem('key','value',function(err){//iferrisnon-null,wegotanerrorlocalforage.getItem('key',function(err,value){//iferrisnon-null,wegotanerror.otherwise,valueisthevalue});});
添加回答
举报
0/150
提交
取消