2017-09-13 67 views
2

我正在開發一個Angular應用程序。我使用其中一個社交網絡提供的API,並且每秒僅限5個API調用。如何使用RxJs限制每個間隔的API調用次數?

最直接的解決方案是編寫自定義邏輯,它將對請求進行計數並將它們排隊等待限制。因此,如果我在一秒內向API發送第六個請求,它將在第一個請求發送後的第二個請求中發送。

但我想找到一些優雅的解決方案,如果有可能使用RxJs。

例如,我可以設置debounseTime可觀察像在下面的例子。但是我實際得到的是,我無法在行中發出幾個請求,間隔小於200毫秒。

this.searchControl.valueChanges 
    .debounceTime(200) // 200ms ~ 5 requests per second 
    .switchMap(search => this.api.searchPeople(search)) 

具有能夠限制一個數每間隔發射的和的情況下,請求隊列他們的任何技術被過於頻繁發送的RxJs?

回答

1

您可以跟蹤最近調用api的次數。所以如果你每秒可以打5個電話,那麼thant意味着你有5個令牌,如果一個令牌被消耗掉了,那麼它會在一秒鐘後更新。我做了以下操作員已經做了你需要的東西:

Observable.prototype.rateLimit = function (count: number, slidingWindowTime: number, scheduler = async) { 
 
    let tokens = count; 
 
    const tokenChanged = new BehaviorSubject(tokens); 
 
    const consumeToken =() => tokenChanged.next(--tokens); 
 
    const renewToken =() => tokenChanged.next(++tokens); 
 
    const availableTokens = tokenChanged.filter(() => tokens > 0); 
 

 
    return this.mergeMap(value => 
 
    availableTokens 
 
    .take(1) 
 
    .map(() => { 
 
     consumeToken(); 
 
     Observable.timer(slidingWindowTime, scheduler).subscribe(renewToken); 
 
     return value; 
 
    })); 
 
} 
 

 
declare module 'rxjs/Observable' { 
 
    interface Observable <T> { 
 
    rateLimit(count: number, slidingWindowTime: number, scheduler ? : Scheduler): Observable <T> 
 
    } 
 
}

+0

真棒。非常感謝,這真的是我想要的。 –

相關問題