You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 19:55:18