微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何处理Dexie交易中的请求?

如何解决如何处理Dexie交易中的请求?

我已经编写了一种方法,可以通过Dexie在一次事务中从IDB读取和写入数据:

transactionalRW<T>(table: string,key: any,handler: (instance: T) => T | Observable<T>): Promise<T> {
    // start transaction with read/write rights
    return this.transaction('rw',this.table(table),() =>
      this.table(table).get(key).then((instance: T) => {
          // let callback handle the fetched object
          const newInstance: T | Observable<T> = handler(instance);
          // treat new instance differently depending on whether or not it is an observable
          if (isObservable(newInstance)) {
            return Dexie.waitFor(newInstance.pipe(switchMap(_newInstance => this.table(table).put(_newInstance))));
          } else {
            return this.table(table).put(newInstance).then(() => newInstance);
          }
        }
      )
    );
  }

如果handler未返回Observable,则此代码可以正常工作。但是,如果在handler中使用了一个后端请求,那么我必须将全部内容包装到Dexie.waitFor(...)中,最后我将返回一个包含Observable的Promise-真难看。我希望能够只将newInstance返回的Observable放入IDB之后,返回一个包含handler的Promise(或Observable)。

有人知道怎么做吗?我无法处理交易外的请求,因为该请求取决于从IDB检索到的数据。

如果我只是这样做:

Dexie.waitFor(...);
return newInstance.toPromise();

抛出Dexie.PrematureCommitError

非常感谢您。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。