gpt4 book ai didi

javascript - 如何使用 RxJS 发出不超过每 N 秒的重复 HTTP 请求

转载 作者:行者123 更新时间:2023-12-03 01:08:25 25 4
gpt4 key购买 nike

我想一次又一次(永远)向 API 端点发出 HTTP 请求,在每个步骤上使用以前的值(提供实时“增量”)。该 API 端点受到限制,因此我每分钟无法发出超过 5 个请求。

因此,如果上一个请求花费了 > 1/5 分钟,那么我们会立即触发下一个请求。否则我们等待 1/5 分钟。

作为在每个步骤上使用先前值的方法,我考虑了 expand 但如何将其与 interval/timer 结合起来,而不是使请求太频繁?

最佳答案

您可以考虑创建一个调用如下函数的 Observable

const callStream = (apiThrottleTime: number) => {
let inputFromPreviousCall;
return interval(apiThrottleTime).pipe(
mergeMap(i => {
console.log('Call counter: ' + i, 'Input from previous call: ' + inputFromPreviousCall);
return callSimulation(inputFromPreviousCall)
}, 1),
tap(result => inputFromPreviousCall = result),
);
}

然后订阅它,将 API 的节流时间作为输入变量传递,例如喜欢

const apiThrottleTime = 1000;
callStream(apiThrottleTime).subscribe();

使用此代码模拟 API 调用

let callCounter = 0;
const callSimulation = (inputFromPreviousCall: number) => {
const call = new Subject<any>();
setTimeout(() => {
call.next(callCounter);
callCounter++;
call.complete();
}, Math.random()*4000);
return call.asObservable();
};

想法如下

  1. 通过间隔,您可以创建您想要的通知节奏底部有,这是 API 的节流时间
  2. 每当这个节奏时钟滴答作响时,您就会调用 API,该 API返回一个可观察对象
  3. 您创建一个新流,将这些新的 Observables 与mergeMap,将并发级别保持在 1 - 并发度level 通过 mergeMap
  4. 的第二个可选参数设置
  5. 您将并发级别设置为 1 可确保维护结果 Observable 的通知序列与节奏时钟的通知顺序相同,即维护 API 调用的顺序,即如果您想使用上一次调用的结果作为输入,这一点至关重要到下一个 - 请注意,并发级别设置为 1 的 mergeMapconcatMap
  6. 相同
  7. 调用结果存储在函数 callStream 的本地变量 inputFromPreviousCall 中,并在后续调用 API 时使用

关于javascript - 如何使用 RxJS 发出不超过每 N 秒的重复 HTTP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52289312/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com