javascript - 如何在 JS 中使用 map() 函数内的 setInterval() 以 1 秒延迟对 API 调用进行排队

标签 javascript settimeout

我有一个函数getData,可以从外部 API 获取数据。如果我每秒发出超过 1 个请求,则会收到 503 错误。因此,我正在考虑对 API 请求进行排队,但这些调用仍然会被批量处理,并且我收到相同的 503 错误。

我将本地存储数据解析为对象(每个对象将发出单独的 API 请求),如果有超过 1 个对象 - 我希望以 1 秒的延迟对所有后续 API 调用进行排队。这是我的代码:

const lsData = JSON.parse(localStorage.getItem('weatherappData'));
if (lsData) {
    lsData.map((location, index) => {
        const city = location.city;
        const country = location.country;
        if (index === 0) {
            getData(city, country, table);
        } else {
            setTimeout(() => getData(city, country, table), 1000);
        }
    });
}

我做错了什么?谢谢!

最佳答案

.map() 不会等待上一个回调。您可以将 1000 乘以 index

setTimeout(() => getData(city, country, table), index * 1000);

或使用async/await

(async() => {
  for (const [index, {city, country}] of lsData.entries()) {
    try {
      if (index === 0) {
        await getData(city, country, table);
      } else {
        await new Promise(resolve => setTimeout(() => resolve(getData(city, country, table)), 1000))
      }
    } catch(e) {
        console.error(e)
    }
  }
})()

请注意,table 未在问题代码中定义。

关于javascript - 如何在 JS 中使用 map() 函数内的 setInterval() 以 1 秒延迟对 API 调用进行排队,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54729294/

相关文章:

javascript - 在 javascript 中的索引

javascript - Mongoose 的正则表达式不传递不从Angular的HTTP服务传递到nodejs

javascript - 代码执行的同步延迟

javascript - 设置超时 ('classInstance.doFoo(arg)' , 750);不会工作

javascript - 找不到模块 : Error: Can't resolve '@cycle/run' webpack 2. 2.1

javascript - 保存并填充 Node js

javascript - 一个 SetInterval 与多个 SetTimeout

javascript - jquery setTimeout 太多递归

javascript - jquery animate 即使条件不满足也执行

javascript - 谷歌地图信息窗口中的 Angular