我想一次又一次(永远)向API端点发出HTTP请求,在每个步骤上使用先前的值(提供实时“增量”)。该API端点受到限制,因此我每分钟不能发出超过5个请求。
因此,如果先前的请求花费了> 1/5分钟,那么我们会立即触发下一个请求。否则,我们将等待1/5分钟。
作为在我想到的expand
的每个步骤中使用先前值的一种方式,但是如何将其与interval
/ timer
结合使用而不会经常发出请求?
答案 0 :(得分:1)
您可以考虑创建一个名为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();
};
想法如下
interval
创建您想要的通知的节奏
有基础,这就是您的API的节流时间mergeMap
,将并发级别保持为1-并发
级别是通过mergeMap
mergeMap
与concatMap
inputFromPreviousCall
的本地变量callStream
中,并在随后的API调用中使用