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

之前用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返回。。。谢谢
慕后森
浏览 564回答 2
2回答

UYOU

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的语法。

函数式编程

推荐使用localForage库,可以使用很简洁的方法操作IndexedDB、WebSQL或localStorage。localforage.setItem('key','value',function(err){//iferrisnon-null,wegotanerrorlocalforage.getItem('key',function(err,value){//iferrisnon-null,wegotanerror.otherwise,valueisthevalue});});
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript