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

如何使JavaScript异步函数pooledDownload在connect失败时返回带消息的Reject

解决pooledDownload函数的Promise拒绝问题

你的代码存在几个关键问题:

  • 函数未返回Promise,外部无法捕获其状态
  • close()调用时机错误,会在download完成前提前关闭连接
  • catch内的throw无法传递到外部,因为是在异步回调上下文执行

以下是修正后的代码,满足connect失败时整个函数返回带错误信息的Reject的需求:

const pooledDownload = (connect, save, downloadList, maxConcurrency) => {
  // 收集所有连接任务的Promise实例
  const tasks = [];

  for (let i = 0; i < maxConcurrency; i++) {
    // 构建完整的异步任务链
    const task = connect()
      .then((connection) => {
        const { download, close } = connection;
        // 确保下载、保存完成后再关闭连接,用return传递Promise状态
        return download(downloadList[i])
          .then((result) => save(result))
          .finally(() => close()); // 无论成功失败都关闭连接
      })
      .catch((err) => {
        // 抛出自定义错误,将当前任务标记为reject
        throw new Error(`连接失败: ${err.message}`);
      });

    tasks.push(task);
  }

  // 返回所有任务的聚合Promise:只要有一个任务reject,整个函数就会返回reject
  return Promise.all(tasks);
};

module.exports = pooledDownload;

核心要点说明:

  • 让函数返回Promise:通过return Promise.all(tasks),外部调用方可以用.catch()捕获整个函数的错误状态
  • 修正异步流程:将download和close纳入Promise链,避免提前关闭连接导致下载失败;用finally保证连接一定会被释放
  • 错误传递逻辑:connect失败时在catch中抛出错误,会让对应任务转为reject状态,Promise.all会在第一个reject出现时立即返回reject,符合你的需求
  • 可选优化:如果downloadList长度小于maxConcurrency,downloadList[i]会取到undefined,可根据实际场景添加边界判断逻辑

内容的提问来源于stack exchange,提问作者Felipe Moreno

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 15:37:34