Спокойный способ выполнения асинхронных запросов с интервалом?
Какой самый элегантный способ (в стеке Calmm, Kefir, Karet Utils и т. Д.) Выполнять повторяющиеся (бесконечные) асинхронные задания с интервалом?
я бы хотел get
некоторые JSON каждый 2000ms
,
Пример 1 (интервал 2000 мс):
- Получить JSON (
get
занимает 100 мс) - Ручка JSON
- Подождите оставшееся время на интервале и начните снова с шага 1
Пример 2 (интервал 2000 мс)
- Получить JSON (
get
занимает 5000 мс) - Ручка JSON
- Дождитесь окончания шагов 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--------...