2017-06-04 10 views
0

私はここで約束されたことを少し新しくしているので、その解決策は簡単なものでも構いません。を使用してIndexedDb内のアイテムを繰り返し削除する約束

私の目標は、クォータが設定されているかどうかを確認し、必要に応じて、スペースがあるまで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ループでは、latestMediaRequestの解像度からdeleteRequeststorageUsedInGbを更新する)の解像度になるまで繰り返します。

+0

'async' /' await'を使用できますか? – Bergi

+0

@Bergiできません:/ – SB2055

+0

次に再帰を使用する必要があります – Bergi

答えて

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 
+0

編集を明確にしていただきありがとうございます。これを今試みている。 – SB2055

関連する問題