html5 IndexedDb 获取数据 异步转同步

之前用localStorage,但是它有容量限制,现在切换成indexedDb 但是看看之前的代码,要改好多,原因就是本来一句话搞点的获取数据:

  var modulesJson = 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返回。。。谢谢

阅读 7.9k
2 个回答

IndexedDB的作者把异步用的过度了。之前的版本是有同步访问功能的,后来他去掉了,后来又说如果将来有必要,可以再加回来。在我看来,数据库访问至少在80%的情况下应该是同步的,必须等待结果,把它做成异步,会给应用层带来很大麻烦。但是他现在既然已经这样了,我们也只能忍着。

如果你的代码可以用es7语法中的async/await方法的话,可以改成下面这样:

async function getAllData() {
    let db = await idb.open('db-name', 1)
    let tx = db.transaction('objectStoreName', 'readonly')
    let store = tx.objectStore('objectStoreName')
    let allSavedItems = await store.getAll()
    console.log(allSavedItems)
    db.close()
}

这样至少从代码表面看起来实现了一个伪同步的效果。如果需要用在浏览器里的话,需要用babel把它转成es5的语法。

推荐使用 localForage 库,可以使用很简洁的方法操作 IndexedDB、WebSQL 或 localStorage。

localforage.setItem('key', 'value', function (err) {
  // if err is non-null, we got an error
  localforage.getItem('key', function (err, value) {
    // if err is non-null, we got an error. otherwise, value is the value
  });
});
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题