如何在try/catch或Promise.all中忽略错误,继续批量API调用?
解决异步请求忽略错误并收集成功结果的方案
方案一:给每个请求包装错误处理,用Promise.all收集后过滤
给每个异步请求单独处理错误,出错时返回null,之后用Promise.all等待所有请求完成,再过滤掉无效值:
async function fetchDetails(ids: Array<string | number>) { const promises = ids.map(async (id) => { try { const result = await api.getFullDetails(id); return result.data || null; } catch { return null; } }); const results = await Promise.all(promises); return results.filter(item => item !== null); }
这个方式里,每个请求的错误都被内部捕获,不会触发未处理Promise拒绝,Promise.all会等待所有请求结束,最后只保留成功且有有效数据的结果。
方案二:使用Promise.allSettled筛选成功结果
利用Promise.allSettled特性,它会等待所有Promise完成(无论成功失败),返回每个请求的状态和结果,之后我们只提取成功的项:
async function fetchDetails(ids: Array<string | number>) { const promises = ids.map(id => api.getFullDetails(id)); const settledResults = await Promise.allSettled(promises); return settledResults .filter(res => res.status === 'fulfilled') .map(res => (res as PromiseFulfilledResult<any>).value.data) .filter(data => data); }
Promise.allSettled会自动处理拒绝的Promise,不会抛出未处理错误,我们只需要过滤出status为fulfilled的结果,再提取有效数据即可。
补充:原代码的问题
你原来的代码里,map返回的是一堆Promise,但没有等待它们完成,所以fullDetails的填充是异步的,无法确定什么时候能拿到最终结果。另外虽然加了try/catch,但如果没有正确等待这些Promise,可能会导致代码逻辑不符合预期。上面两个方案都解决了这个时序问题,同时实现了忽略错误的需求。
内容的提问来源于stack exchange,提问作者Sharon
相关产品推荐
相关产品推荐

