我想一次又一次地向API端点发出HTTP请求(永远),在每一步上使用以前的值(提供活动的“增量”)。该API端点被限制,因此我每分钟不能发出超过5个请求。
因此,如果前一个请求耗时超过1/5分钟,那么我们将立即触发下一个请求。否则,我们将等待1/5分钟。
作为在每一步中使用之前的值的一种方式,我考虑了expand
,但是如何将其与interval
/timer
结合起来以避免请求太频繁呢?
发布于 2018-09-14 03:43:39
您可以考虑创建一个调用如下函数的可观察对象
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
创建你想要的通知的节奏,这是你的APImergeMap
与concatMap
inputFromPreviousCall
中,位于函数callStream
的本地,并在后续调用时使用
https://stackoverflow.com/questions/52289312
复制相似问题