【问题标题】:Handling request queue asynchronos with Dexie.js使用 Dexie.js 处理请求队列异步
【发布时间】:2019-11-05 12:57:49
【问题描述】:

我目前正在使用 Dexie.js 处理来自 IndexedDB 的“缓存”请求。起初,我将请求保存到 IndexedDB 队列中,以便一次全部刷新。不幸的是,我的条目发出后似乎无法删除。

我按照official docs 中的指南/示例进行操作,但我无法让它发挥作用。我什至试图将它集中到一个带有 'rw' 的 db.transaction 中

function flushQueue(){
  queueRunning = true; // used to mimic singleton pattern

  return db.queue.orderBy(':id').modify(async function(value){
    var _this = this;
    return deserializeRequest(value.serializedReq).then(async function(request){
      return fetch(request).then(function(){
        notifyClients("Request has been sent: ", request);
        // deleting request from queue
        delete _this.value;
      });
    });
  });
}

有什么想法会出错吗?

亲切的问候, 费利克斯

【问题讨论】:

  • 您是否尝试过使用箭头功能,就像文档中提到的那样? (value, ref) => { delete ref.value; });
  • 您的链中是不是也缺少equals.where("isKindToMe").equals("no").modify
  • 我假设不需要 where/equals 语句,因为 orderBy() 也返回一个 Collection 对象——就像 .equals() 一样。
  • 当我尝试从内部 then-callback... 中删除 ref.value 时,箭头函数方法也不起作用...

标签: javascript asynchronous indexeddb dexie


【解决方案1】:

要修改的回调必须是同步的,不能是异步的。 如果你需要做异步工作,你必须先使用 toArray() 拉取现有条目,然后在内存中修改它们,完成后使用 bulkPut() 更新它们。

在您的情况下,您正在处理一个队列。似乎涉及每个队列项的其他异步操作。

我建议您改为使用单独的函数,仅处理队列中的第一个项目,当处理成功时,删除该项目。然后异步调用该函数,直到队列为空。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-10
    • 2014-10-06
    • 2018-03-28
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多