【问题标题】:Wait function for throttled API calls in a loop循环中限制 API 调用的等待函数
【发布时间】:2020-08-27 22:56:29
【问题描述】:

我正在尝试处理每次通过循环时要调用的 3 个受限制的 API 端点。我试图确保每次调用迭代之间有 500 毫秒的延迟,所以我不会发出太多请求,而是在等待 500 毫秒 * 迭代次数后发出所有调用,这当然会达到请求限制返回 429。

我所做的是创建了一个我认为很简单的等待函数,但它不起作用,所以我开始搜索这个问题。我发现的几乎每个解决方案都是相同类型的函数,它要么忽略等待,要么执行我现在正在经历的事情,或者建议使用我正在避免的第 3 方依赖项,因为这是我唯一这样做的地方我的代码。现在我有了一个新的等待功能,根据研究稍作修改。这是我当前的代码:

// wait function

async function wait(ms) {
  return new Promise(resolve => {
    setTimeout(resolve, ms);
  });
}


// one of 3 identical api calls (except the endpoint changes, in this case I've filled it with 
example.com)

function callAPI(param) {
    return fetch (`https://example.com?param=${param}`)
        .then(res => {
            if (res.ok) {
                return res.json();
            }
        });
}


// Iteration

async function getEach(arr) {
    arr.forEach(async name => {
        await wait(500);
        await callAPI(name);
        // then api call 2, 3
        // then return, console log, append to obj or array, w.e. with the api results
    });
}

getEach(arrList);

我希望知道的是:

  1. 了解为什么这不符合我的想法
  2. 如何达到我想要的结果

谢谢

【问题讨论】:

标签: javascript api


【解决方案1】:

Array.forEach 不会等待 wait() 和 callAPI() 调用完成,因此它们会很快被连续调用。但是您可以使用 for .. of 循环或仅使用 for 循环轻松完成此操作。

例如:

async function getEach(arr) {
    for(let name of arr) {
        await wait(500);
        await callAPI(name);
    }
}

async function getEach(arr) {
    for(let i = 0; i < arr.length; i++) {
        await wait(500);
        await callAPI(arr[i]);
    }
}

【讨论】:

  • 谢谢!我发现了一些使用 forEach 的示例,无论出于何种原因,这解释了为什么我的尝试都没有很清楚地起作用。我会尽快接受。
  • 令人讨厌的是,这是来自 Array.forEach 的行为.. 可能不是我们所期望的。但至少我们可以使用其他循环结构来完成工作!
  • 是的,这很烦人,我无法想象如果所有循环都具有相同的行为,那会让我发疯。我很少使用forEach,但是有一个清晰的数组可以迭代而无需突变,我什至没有想过尝试使用forfor of。感谢您挽救了这一天,我在这方面花费了令人尴尬的时间
  • 我想我们都被这个弄糊涂了,浪费了时间,至少我们可以从彼此的经验中受益!
猜你喜欢
  • 2020-06-28
  • 1970-01-01
  • 2019-07-02
  • 2019-02-05
  • 1970-01-01
  • 2018-12-14
  • 1970-01-01
  • 1970-01-01
  • 2017-07-21
相关资源
最近更新 更多