如何在JavaScript中延迟fetch请求以避免429错误?
解决逆地理编码请求429错误的延迟方案
你的代码里有两个关键问题导致所有请求同时发起:
- 错误使用大写的
SetTimeout,正确写法是小写setTimeout - 直接在
setTimeout中调用reverseGeocode(mapMarkers[i].getLatLng()),这会立即执行函数,而非将其作为延迟回调;同时循环中所有延迟都设为1000ms,三个请求几乎同时触发
下面提供两种可靠的解决方法:
方法一:错开定时器延迟
给每个请求设置递增的延迟,确保请求间隔符合每秒2次的限制(比如间隔500ms),同时用箭头函数包裹回调避免立即执行:
for (let i = 0; i < mapMarkers.length; i++){ // 第一个请求0ms执行,第二个500ms,第三个1000ms,依次错开 setTimeout(() => { reverseGeocode(mapMarkers[i].getLatLng()); }, i * 500); };
注意修正SetTimeout为小写setTimeout,并通过箭头函数传递reverseGeocode的调用逻辑,避免提前执行。
方法二:异步顺序处理(更稳定)
如果想确保前一个请求完成后再发起下一个(避免网络波动导致的请求叠加),可以改用async/await实现顺序执行:
// 新增批量处理函数 async function processAllMarkers() { for (let i = 0; i < mapMarkers.length; i++){ const coords = mapMarkers[i].getLatLng(); // 等待当前请求处理完成 await reverseGeocode(coords); // 间隔500ms再发起下一个请求,符合接口限制 await new Promise(resolve => setTimeout(resolve, 500)); } } // 修改reverseGeocode为async函数,确保等待请求完成 async function reverseGeocode(coords){ var today = new Date(); var time = today.getHours() + ":" + today.getMinutes() + ":" + today.getSeconds(); console.log("Into reverse geocoder " + time); let REVERSEURL = `https:....` let TOKEN = '.....' let url = `${REVERSEURL}key=${TOKEN}&lat=${coords.lat}&lon=${coords.lng}`; // 等待getData异步操作完成 await getData(url, coords); } // 启动批量处理 processAllMarkers();
这种方式会严格按照顺序处理每个坐标,完全不会触发429错误。
内容的提问来源于stack exchange,提问作者David Graham
相关产品推荐
相关产品推荐

