为了账号安全,请及时绑定邮箱和手机立即绑定

新手上路,html5 IndexedDb 获取数据 异步转同步

新手上路,html5 IndexedDb 获取数据 异步转同步

慕后森 2019-08-17 11:27:29
之前用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的语法。
                            
查看完整回答
反对 回复 2019-08-17
?
函数式编程

TA贡献1807条经验 获得超9个赞

推荐使用localForage库,可以使用很简洁的方法操作IndexedDB、WebSQL或localStorage。
localforage.setItem('key','value',function(err){
//iferrisnon-null,wegotanerror
localforage.getItem('key',function(err,value){
//iferrisnon-null,wegotanerror.otherwise,valueisthevalue
});
});
                            
查看完整回答
反对 回复 2019-08-17
  • 2 回答
  • 0 关注
  • 562 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信