如何使用RxJS每隔N秒发出一次重复的HTTP请求

时间:2018-09-12 07:05:21

标签: javascript rxjs

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

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

作为在我想到的expand的每个步骤中使用先前值的一种方式,但是如何将其与interval / timer结合使用而不会经常发出请求?

1 个答案:

答案 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();
};

想法如下

  1. 使用interval创建您想要的通知的节奏 有基础,这就是您的API的节流时间
  2. 每次节奏时钟计时,然后调用API, 返回一个Observable
  3. 您创建一个新的流,将这些新的Observable与 mergeMap,将并发级别保持为1-并发 级别是通过mergeMap
  4. 的第二个可选参数设置的
  5. 您将并发级别设置为1的事实可确保 维持产生的Observable的通知顺序 与节奏时钟的通知顺序相同, 即维持对API的调用顺序,即 如果要使用上一个调用的结果作为输入,则至关重要 转到下一个-注意将{em> concurrency level 设置为1的mergeMapconcatMap
  6. 相同
  7. 调用结果存储在函数inputFromPreviousCall的本地变量callStream中,并在随后的API调用中使用