使用 fetch 在节点中进行异步 api 调用的最佳实践?
Posted
技术标签:
【中文标题】使用 fetch 在节点中进行异步 api 调用的最佳实践?【英文标题】:Best practice for making async api calls in node using fetch? 【发布时间】:2020-08-19 12:15:30 【问题描述】:我正在 nodeJS、express 和 mysql 中构建一个应用程序,在其中我使用 node fetch 从几个不同的 API 收集数据,其中一个限制为每 5 分钟 200 次调用。 为了完全更新我的数据库,我基本上需要不间断地运行对这个 API 的调用, 目前我正试图通过在 for 循环/foreach 中使用睡眠来保持在限制范围内。
问题是每个请求都可能随时间变化,看起来我可以使调用更有效,而不是为每个请求不断休眠相同的时间。我想知道是否有更好的方法来做到这一点?我一直在考虑让例如 199 个调用异步,然后正好等待 5 分钟,然后重复它..但我不知道如何。
找不到关于此的主题,但如果已经有好的答案,请做一个链接。 非常感谢您的回答,如果您有其他反馈,请告诉我!
for (let i = 1; i < length; i++)
try
let id = IdCollection[i];
let resultFromApiCall = await datafetcher.MakeApiCall(id);
await sleep(2000);
catch (error)
console.log("Error in api-calls" + error);
```
【问题讨论】:
我认为最佳解决方案取决于您在此处获取的内容。我不知道每个fetch
之间是否需要延迟,因为我不知道你在获取什么。
如果你绝对需要发出这么多请求,也许你应该研究一下 WebSockets (html5rocks.com/en/tutorials/eventsource/basics)
【参考方案1】:
我认为这是一个品味问题。
我会立即发出所有允许的请求,然后等到 5 分钟间隔结束。
// constants to define the restrictions
const restrictionCalls = 5;
const restrictionTime = 300000; // 5 * 60 * 1000
let throttleTimer = Date.now(); // when did we start this interval?
let throttleCounter = 0; // how many calls did we make in this interval?
for (let i = 1; i < length; i++)
try
let id = IdCollection[i];
throttleCounter++;
let resultFromApiCall = await datafetcher.MakeApiCall(id);
catch (error)
console.log("Error in api-calls" + error);
if(throttleCounter === restrictionCalls)
const timePassed = Date.now() - throttleTimer;
const waitTime = restrictionTime - timePassed;
if(waitTime > 0) await sleep(waitTime);
// reset
throttleTimer = Date.now();
throttleCounter = 0;
【讨论】:
谢谢!尝试一下,它似乎与一些小的调整效果很好。太棒了:)以上是关于使用 fetch 在节点中进行异步 api 调用的最佳实践?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 asyncio 和 aiohttp 异步通过 api 响应进行分页
如何在带有 Jest 的 react-native 中使用模拟的 fetch() 对 API 调用进行单元测试