【问题标题】:Using Promises to iteratively delete items in IndexedDb使用 Promises 迭代删除 IndexedDb 中的项目
【发布时间】:2017-06-04 18:28:03
【问题描述】:

我对这里的 promises 有点陌生,所以解决方案可能是微不足道的/语法上的。

我在存储媒体时的目标是查看是否设置了配额,并且 - 如果需要 - 从 store 删除项目直到我们有空间。

我的尝试在这里,但我最大的痛点是while循环——弄清楚如何等到一个项目被删除后重新评估是否继续删除:

   const store = database.transaction(storeName, "readwrite").objectStore(storeName);
   while (storageUsedInGb > storageQuotaInGb) {
       // problem: pause loop here
       const latestMediaRequest = store.get(latestMediaGuid);
       latestMediaRequest.onsuccess = function(event) {
              var deleteRequest = store.delete(latestMediaGuid);
              deleteRequest.onsuccess = function () {
                    storageUsedInGb -= event.target.media.size / 1024 / 1000 / 1000;
                       // problem: continue loop here
              }
              deleteRequest.onerror = reject;
        }
        latestMediaRequest.onerror = reject;
    }

如何告诉 while 循环等待迭代,直到我从 latestMediaRequestdeleteRequest 得到解决方案(更新 storageUsedInGb)?

【问题讨论】:

  • 你能用async/await吗?
  • @Bergi 我不能:/
  • 那你需要使用递归

标签: javascript jquery promise indexeddb


【解决方案1】:

您可以使用递归调用的函数进行异步循环。该函数可以是立即调用的函数表达式:

const store = database.transaction(storeName, "readwrite").objectStore(storeName);
(function loop(storageUsedInGb) {
    if (storageUsedInGb <= storageQuotaInGb) {
        // if you are in a promise constructor callback, you will call resolve() here
        return; // exit chain of loop calls
    }
    const latestMediaRequest = store.get(latestMediaGuid);
    latestMediaRequest.onsuccess = function(event) {
        var deleteRequest = store.delete(latestMediaGuid);
        deleteRequest.onsuccess = 
            loop.bind(null, storageUsedInGb-event.target.media.size / 1024 / 1000 / 1000);
        deleteRequest.onerror = reject;
    }
    latestMediaRequest.onerror = reject;
})(storageUsedInGb); // call immediately

【讨论】:

  • 感谢您的澄清编辑 - 我是。现在试试这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-05
  • 1970-01-01
  • 2021-11-08
  • 2014-10-26
相关资源
最近更新 更多