Chrome扩展异步递归深度删除文件夹的实现疑问
问题分析与修正方案
你的代码存在两个关键问题,会导致删除操作不完整或者逻辑不符合预期:
递归调用未处理异步结果,导致Promise收集不全
你在folders.forEach((folder) => removeFolder(folder.uuid))中调用了异步的removeFolder,但既没有等待它执行完成,也没有把它返回的Promise加入promiseList。这会导致外层的await removeFolder(uuid)执行完毕时,子文件夹的删除操作可能还没把对应的Promise加入列表,最终Promise.all(promiseList)会漏掉部分删除请求。变量名与存储结构不匹配
你的存储结构里文件和文件夹的ID字段是id,但代码里用了file.uuid,这会导致无法正确获取要删除的文件ID,进而删除失败。
修正后的代码
我们调整逻辑,确保所有异步删除操作都被正确收集并并行执行:
const deepRemoveFolder = async (uuid) => { const removeFolder = async (uuid) => { const storage = await chrome.storage.sync.get(uuid); if (!storage[uuid]) return []; const { files, folders } = storage[uuid]; const deletePromises = []; // 添加当前文件夹下直接子文件的删除Promise files.forEach(file => deletePromises.push(chrome.storage.sync.remove(file.id))); // 并行递归处理所有子文件夹,收集它们的删除Promise const subFolderTasks = folders.map(folder => removeFolder(folder.id)); const subFolderPromises = await Promise.all(subFolderTasks); // 合并子文件夹返回的所有删除Promise subFolderPromises.forEach(promises => deletePromises.push(...promises)); // 添加当前文件夹自身的删除Promise deletePromises.push(chrome.storage.sync.remove(uuid)); return deletePromises; }; // 获取所有待执行的删除Promise,并行执行 const allDeleteTasks = await removeFolder(uuid); await Promise.all(allDeleteTasks); };
关键改进说明
- 递归返回完整Promise列表:每个
removeFolder会收集当前文件夹、子文件、子文件夹的所有删除Promise并返回,确保没有遗漏任何删除操作。 - 并行处理子文件夹:用
folders.map配合Promise.all并行处理所有子文件夹的删除,避免串行等待,提升操作效率,符合你想要的无依赖并行需求。 - 修正字段名匹配问题:把代码中的
file.uuid改为file.id,和存储结构的字段对应,保证能正确定位要删除的文件。
内容的提问来源于stack exchange,提问作者Dako Albeik
相关产品推荐
相关产品推荐

