如何让getUrl函数重复执行直到返回结果不为400错误?
实现重复执行直到返回非400结果
可以通过异步重试函数配合while循环实现需求,同时建议添加重试间隔避免频繁请求服务器:
async function getUrlWithRetry() { let result; while (true) { result = await getUrl(); // 拿到非400结果就返回 if (result !== 400) { return result; } // 失败后等待3秒再重试,可根据需求调整间隔 await new Promise(resolve => setTimeout(resolve, 3000)); } } // 使用示例 // getUrlWithRetry().then(data => { // console.log('成功获取数据:', data); // }).catch(err => { // console.error('请求异常:', err); // });
关键细节说明
- 重试函数必须是异步的,用
async/await处理getUrl的异步流程 while(true)会持续循环,直到获取到非400结果才终止并返回数据- 添加延迟是为了避免短时间内重复请求给服务器造成压力,间隔时间可按需修改
如果需要限制最大重试次数,防止无限循环,可以用下面的版本:
async function getUrlWithRetry(maxRetries = 5) { let result; let retries = 0; while (retries < maxRetries) { result = await getUrl(); if (result !== 400) { return result; } retries++; await new Promise(resolve => setTimeout(resolve, 3000)); } // 达到重试上限后抛出错误 throw new Error('已达最大重试次数,仍未获取有效结果'); }
另外,原getUrl的catch块为空,网络错误时会返回undefined,若需要网络错误时也继续重试,可修改getUrl的错误处理:
async function getUrl() { try { let res = await fetch(myURL, { method: 'GET', headers: { 'Content-type': 'application/json; charset=UTF-8' } }); if (res.ok) { return await res.json(); } else { return 400; } } catch (error) { // 网络错误时返回400,让重试逻辑继续执行 return 400; } }
内容的提问来源于stack exchange,提问作者streaming-coc
相关产品推荐
相关产品推荐

