2015-09-26 7 views
1

У меня есть функция createEvent(), которая отправляет запрос в календарь Google.RxJS: Отправить x запросов в секунду

API Google Calendar требует, чтобы я отправлял максимум 5 запросов в секунду.

Если я позвоню createEvent() 100 раз, это закроет календарь Google и мои запросы будут лишены. Если возможно, я бы хотел, чтобы createEvent() содержал логику, требуемую для запросов на передачу до 5 в секунду.

Я пытаюсь избежать,

calendar.addEventToQueue(eventData); 
calendar.addEventToQueue(eventData); 
calendar.addEventToQueue(eventData); 
cleandar.submitEvents(); 

и вместо того, чтобы просто

calendar.createEvent(eventData); 
calendar.createEvent(eventData); 
calendar.createEvent(eventData); 

ответ

1

Я думаю, что я дал этот ответ некоторое время назад на rate limiting.

Вы можете сделать это с RxJS:

//This would be replaced by whatever your event source was 
//I just made it a button click in this case 
var source = Rx.Observable.fromEvent($button, 'click') 

    //Captures either all the events for one second for a max of 5 events 
    //Projects each set into an Observable 
    .windowWithTimeOrCount(1000, 5) 

    //Only the first window in a single second gets propagated 
    //The others will be dropped 
    .throttleFirst(1000) 

    //Flatten the sequence by concatenating all the windows 
    .concatAll() 

    //Build the event body now *after* we have done filtering 
    .flatMap(function() { 
    //The calendar request api supports promises which are 
    //handled implicitly in Rx by operators like flatMap. As a result 
    //this will automatically wait until it receives a response. 
    return gapi.client.calendar.events.insert(/*event body*/); 
    }); 

//Process the response 
source.subscribe(
    function(response) { console.log('Event successfully created!'); }); 
+0

спасибо за ответ, это действительно полезно. Вопрос: 'throttleFirst' не существует в' requrie ('rx') 'в узле. Любые рекомендации? –

+0

Забыто было [устарело] (https://github.com/Reactive-Extensions/RxJS/issues/928) в 3.1.2. Теперь его просто называют «дросселем». – paulpdaniels

+0

Спасибо @paulpdaniels, мой источник событий - поток запросов к событиям. Который должен быть буферизован (задерживается), если они превышают 5 в секунду «дроссельной заслонкой», похоже, отбрасывает дополнительные события и сохраняет только первый выход. –

Смежные вопросы