捕获错误后如何重试异步生成器并继续迭代流程?
问题
现有一个用于无限处理数据的异步生成器,代码如下:
// infinite data processing async function* createDataProcessingIterator() { try { while (true) { const { data: { items }} = await axios.get(API_URL); const processedData = processData(items); yield processedData; } } catch (err) { console.log('Error while iterating: ', err); } } const dataProcessingIterator = createDataProcessingIterator(); for await (const data of dataProcessingIterator) { // manage processed data }
当前代码运行正常,但一旦捕获到API服务器错误这类异常,整个迭代器会直接停止,无法继续后续的迭代流程。请问如何修改才能在捕获错误后继续迭代?
解决方案
核心是把错误捕获的范围缩小到单次请求处理周期,而不是包裹整个无限循环。这样单次请求出错后,只会跳过当前这一轮的处理,循环会继续执行下一次请求,不会终止生成器。
修改后的代码如下:
// infinite data processing async function* createDataProcessingIterator() { while (true) { try { const { data: { items }} = await axios.get(API_URL); const processedData = processData(items); yield processedData; } catch (err) { console.log('Error during current request: ', err); // 可选:添加延迟后重试,避免频繁请求出错的API await new Promise(resolve => setTimeout(resolve, 3000)); } } } const dataProcessingIterator = createDataProcessingIterator(); for await (const data of dataProcessingIterator) { // manage processed data }
关键说明
try/catch被移到了while(true)循环内部,每次循环都会重新执行try块里的请求逻辑- 当某次请求出错时,会进入catch块打印错误,之后循环会自动回到下一轮迭代
- 可选添加延迟重试:在catch里用
setTimeout加几秒延迟,避免短时间内频繁请求故障API,减少服务器压力和无效请求
额外建议
如果需要更健壮的处理,可以:
- 记录错误次数,当错误达到一定阈值时临时停止或触发告警
- 根据错误类型做不同处理:比如网络超时重试,404这类永久错误直接跳过当前请求
内容的提问来源于stack exchange,提问作者James Jr.
相关产品推荐
相关产品推荐

