Calmm-way of doing async requests with interval?

170 views Asked by At

What's the most elegant way (in Calmm stack, Kefir, Karet Utils etc.) of doing repeated (infinite) async jobs with interval?

I want to get some json every 2000ms.

Example 1 (2000ms interval):

  1. Fetch json (get takes 100ms)
  2. Handle json
  3. Wait the remaining time left on the interval, and start again from step 1

Example 2 (2000ms interval)

  1. Fetch json (get takes 5000ms)
  2. Handle json
  3. Wait until steps 1 and 2 are finished before starting again at step 1

So in short, I want to to repeated gets (or any async work) and wait a minimum of 2000ms between requests.

I don't want the next request to fire until the previous one has finished in some way (success, fail, timeout).

1

There are 1 answers

0
jcbelanger On

This is how I would do that with Kefir without resorting to Kefir.stream. Note that job below would be the task you do at each tick. I stubbed a dummy task for the code to work.

let result = Kefir.repeat(() => {
    let job = Kefir.later(Math.random() * 5000);
    let wait = Kefir.later(2000).ignoreValues();
    return Kefir.merge([job, wait]);
});

Below is a visualization of the events using the style from the Kefir documentation:

spawned 1 - job:   ------1X
spawned 1 - wait:  -----------X
spawned 1 - merge: ------1----X
spawned 2 - job:               ------------------2X
spawned 2 - wait:              -----------X
spawned 2 - merge:             ------------------2X
spawned 3 - job:                                   ---3X
spawned 3 - wait:                                  -----------X
spawned 3 - merge:                                 ---3-------X
result:            ------1-----------------------2----3--------...