如何使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
相关产品推荐
相关产品推荐

