使用迭代性删除索引的项目的承诺



我在这里对承诺有点陌生,因此解决方案可能是微不足道的/句法。

存储媒体时我的目标是查看是否设置了配额,并且 - 如果需要 - 从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;
    }

当循环等待迭代时,我该如何分辨直到我从latestMediaRequestdeleteRequest分辨率(更新storageUsedInGb(的分辨率?

您可以通过递归调用的函数异步循环。该函数可以立即调用函数表达式:

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

最新更新