2017-09-13 9 views
2

私はAngularアプリケーションを開発しています。私はソーシャルネットワークの1つで提供されているAPIを使用しており、毎秒5つのAPI呼び出しの制限があります。RxJでインターバルごとにAPIコールの数を制限する方法は?

最も直接的な解決策は、リクエストを数え、制限に合わせてキューに入れるカスタムロジックを書くことです。したがって、6番目のリクエストを1秒以内にAPIに送信すると、1回目のリクエストが送信されてから2番目に送信されます。

しかし、RxJを使用することができれば、わかりやすいソリューションを探したいと思います。

例えば、私は、次の例のように観測ためdebounseTimeを設定することができます。しかし、私が実際に得ているのは、行間に200ミリ秒より短い間隔でリクエストをいくつか行うことができないということです。

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

間隔あたり発するの数を制限した場合のリクエストでそれらをキューすることができます任意の技術があまりにも頻繁に送信されているRxJsていますか?

答えて

1

あなたは最近apiを何回呼び出したかを把握することができます。したがって、毎秒5コールを行うことができれば、トークンが5つあることを意味し、トークンが消費された場合は、1秒後に更新されます。

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

素晴らしい:私は何が必要ありません、次の演算子を作りました。ありがとう、本当に私が欲しいものです。 –

関連する問題