You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Chrome扩展异步递归深度删除文件夹的实现疑问

问题分析与修正方案

你的代码存在两个关键问题,会导致删除操作不完整或者逻辑不符合预期:

  1. 递归调用未处理异步结果,导致Promise收集不全
    你在folders.forEach((folder) => removeFolder(folder.uuid))中调用了异步的removeFolder,但既没有等待它执行完成,也没有把它返回的Promise加入promiseList。这会导致外层的await removeFolder(uuid)执行完毕时,子文件夹的删除操作可能还没把对应的Promise加入列表,最终Promise.all(promiseList)会漏掉部分删除请求。

  2. 变量名与存储结构不匹配
    你的存储结构里文件和文件夹的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 12:45:44