使用 Promises 迭代删除 IndexedDb 中的项目
Using Promises to iteratively delete items in IndexedDb
我对这里的承诺有点陌生,所以解决方案可能很简单/语法。
我在存储媒体时的目标是查看是否设置了配额,并且 - 如果需要 - 从 store
中删除项目,直到我们有 space。
我的尝试就到这里,但我最大的痛点是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 循环等待迭代,直到我从 latestMediaRequest
和 deleteRequest
(更新 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
我对这里的承诺有点陌生,所以解决方案可能很简单/语法。
我在存储媒体时的目标是查看是否设置了配额,并且 - 如果需要 - 从 store
中删除项目,直到我们有 space。
我的尝试就到这里,但我最大的痛点是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 循环等待迭代,直到我从 latestMediaRequest
和 deleteRequest
(更新 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