Спокойный способ выполнения асинхронных запросов с интервалом?

Какой самый элегантный способ (в стеке Calmm, Kefir, Karet Utils и т. Д.) Выполнять повторяющиеся (бесконечные) асинхронные задания с интервалом?

я бы хотел get некоторые JSON каждый 2000ms,

Пример 1 (интервал 2000 мс):

  1. Получить JSON (get занимает 100 мс)
  2. Ручка JSON
  3. Подождите оставшееся время на интервале и начните снова с шага 1

Пример 2 (интервал 2000 мс)

  1. Получить JSON (get занимает 5000 мс)
  2. Ручка JSON
  3. Дождитесь окончания шагов 1 и 2, затем начните снова с шага 1

Короче говоря, я хочу повторить get s (или любая асинхронная работа) и подождите минимум 2000ms между запросами.

Я не хочу, чтобы следующий запрос выполнялся до тех пор, пока предыдущий не завершится каким-либо образом (успех, сбой, тайм-аут).

1 ответ

Вот как бы я сделал это с кефиром, не прибегая к Kefir.stream, Обратите внимание, что job ниже будет задача, которую вы делаете на каждом тике. Я поставил фиктивную задачу, чтобы код работал.

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

Ниже приведена визуализация событий с использованием стиля из документации кефира:

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--------...
Другие вопросы по тегам