递归异步深层文件夹删除



我正在开发一个chrome扩展,它允许用户创建视频注释。我用文件系统呈现了一个iframe,以帮助用户对文件进行排序。chrome.storage中文件系统的表示如下:

const storage = {
"ROOT": {
files: [],
folders: [{id: "folder_id", name: "Folder 1"}]
},
"folder_id": {
files: [{id: "file_id", name: "File 1"}],
folders: []
},
"file_id": {
"bookmarks": {}
},
}

请注意,存储中的每个键都是文件夹、文件或根的id。每个文件夹对象包含两个对象数组,表示要显示的有关其嵌套文件和文件夹的信息。但是,这些数组中的每个对象都不包含进一步嵌套的信息。使用这种结构,我试图弄清楚如何异步启用文件夹删除,也许可以使用递归。这是我的:

const deapRemoveFolder = async (uuid) => {
const promiseList = [];

const removeFolder = async (uuid) => {
const storage = await chrome.storage.sync.get(uuid);
if (storage[uuid]) {
const { files, folders } = storage[uuid];
// remove all directly nested files from storage
files.forEach((file) =>
promiseList.push(chrome.storage.sync.remove(file.uuid))
);
// remove the key for the folder itself
promiseList.push(chrome.storage.sync.remove(uuid));
// if no more folders are nested, then exist the function
if (folders.length === 0) return;
folders.forEach((folder) => removeFolder(folder.uuid));
}
};
await removeFolder(uuid);
await Promise.all(promiseList);
};

我不确定这是否正确,也不知道是否需要包括";等待";在函数"的最后一行;removeFolder";。我想确保我同时履行这些承诺,因为并非所有承诺都相互依赖。如果需要,我可以提供更多的澄清。

您说过:"但是这些数组中的每个对象不包含任何进一步嵌套的信息";。

所以一级文件夹中并没有文件夹。我理解正确吗?

如果是这样,为什么不使用chrome.storage.sync.get读取整个存储,删除所需的子结构(即delete storage.folder_id删除storage.file_id"(最后用chrome.storage.sync.set保存修剪后的对象?

请注意,chrome.storage中的元素存储为键+值对,不可能使用remove方法直接删除子树。

编辑

我可能误解了一件事。

如果您调用waitchrome.storage.sync.get(null(,则只得到一个名为"的项;存储";或者你得到一个根项目与几个文件夹和文件项目?

如果正确的答案是一个,那么我以前的答案仍然有效(你必须剪切/修剪对象,然后在工作结束时将其保存在chrome.storage中(

如果正确的答案是2,那么事情就更简单了,因为您可以使用remove方法和对象id直接删除任何项目,而不需要麻烦递归和其他事情。

最新更新