从存储中删除所有符合条件的对象-Chrome扩展JavaScript



我想写一个函数,返回一个Promise,该函数在从存储中删除所有具有特定值属性的对象后解析,但要做到这一点,我需要在循环中调用remove,这是异步的,所以我不知道如何在删除所有对象后安全地解析。

以下是我如何在删除一个对象后解决问题:

function remove(value) {
return new Promise(function(resolve, reject) {
// Get all objects from storage
chrome.storage.local.get(null, function(allStorage) {
// Loop through keys
for(let key in allStorage) {
// Remove if the property === value
if(allStorage[key].property === value) {
chrome.storage.local.remove(key, function() {
// Done removing one object
resolve();
});
}
}
});
});
}

但我想删除所有这些:

function removeAll(value) {
return new Promise(function(resolve, reject) {
// Get all objects from storage
chrome.storage.local.get(null, function(allStorage) {
// Loop through keys
for(let key in allStorage) {
// Remove if the property === value
if(allStorage[key].property === value) {
chrome.storage.local.remove(key, function() {
// Done removing one object
});
}
}
// How can I safely resolve here, when all objects are removed?
resolve();
});
});
}

在了解了更多关于承诺的信息后,我最终做了这件事。我觉得一定有办法让它更干净。

function removeAll(value) {
return new Promise(resolve => {
let promises = [];
// Get all objects from storage
chrome.storage.local.get(null, allStorage => {
// Loop through keys
for(let key in allStorage) {
// Remove if the property === value
if(allStorage[key].property === value) {
// Create a new promise that resolves when object is removed
let promise = new Promise(resolve => {
chrome.storage.local.remove(key, _ => {
console.log('deleted object from storage');
resolve();
});
});
// Push to array of promises
promises.push(promise);
}
}
// Resolve the function return promise when all promises in array resolve
Promise.all(promises).then(_ => {
resolve();
});
});
});
}

哦显然移除接受数组。

function removeAll(value) {
return new Promise(resolve => {
// Get all storage
chrome.storage.local.get(null, allStorage => {
let keysToRemove = [];
// Loop through all keys
for(let key in allStorage) {
// Get the object associated with key
let object = allStorage[key];
// Push to remove array if value matches argument
if(object.property === value) {
keysToRemove.push(key);
}
}
chrome.storage.local.remove(keysToRemove, _ => {
resolve();
});
});
});
}

最新更新