Почему я должен использовать опрос RxJS interval () или timer () вместо window.setInterval ()?

Случай использования: вызывать функцию каждую минуту (60000 мс), которая отправляет действие хранилища для извлечения lastUpdatedсостояния элементов, которое после ответа и фильтрации обновляет хранилище, а обновленное хранилище считывается как наблюдаемое и отображается в представлении). Это должно произойти до тех пор, пока веб-приложение открыто (так неопределенно).

В настоящее время я использую это:

this.refreshDate = window.setInterval(
  () => this.store.dispatch(new FetchLastUpdate())
, 60000);

И когда view уничтожается / демонтируется, я удаляю if ( this . RefreshDate ) { clearInterval ( this . RefreshDate ); } следующим образом:

interval(60000)
  .pipe(
    startWith(0),
    switchMap(() => this.store.dispatch(new FetchLastUpdate()))
   );

Является ли это эффективным / эффективным, или это хлопотно?

Почему я хочу использовать стратегию опроса RxJS, например:

timer(0, 60000)
  .pipe(
    switchMap(() => this.store.dispatch(new FetchLastUpdate()))
  );

Или

window.setInterval()

TL; DR: timer() против RxJS interval()/subscribe


Заключение / ответы (для удобства исследований):

Существует большая польза от использования функций RxJS для установки интервала или выполнения опроса, эти преимущества объясняются в выбранном ответе, но также и в комментариях, но делается заключение (в результате обсуждений в комментариях), что для очень простого требования, определенного в " Use case "в начале этого сообщения, нет необходимости использовать RxJS, и на самом деле, если вы не используете RxJS в любой другой части вашей программы, не импортируйте его только для этого, однако в моем случае у меня было уже импортировал и использовал RxJS в другом месте.

javascript,typescript,rxjs,rxjs5,rxjs6,

1

Ответов: 2


TL; DR: timer() против RxJS interval()/subscribe


Заключение / ответы (для удобства исследований):

Существует большая польза от использования функций RxJS для установки интервала или выполнения опроса, эти преимущества объясняются в выбранном ответе, но также и в комментариях, но делается заключение (в результате обсуждений в комментариях), что для очень простого требования, определенного в " Use case "в начале этого сообщения, нет необходимости использовать RxJS, и на самом деле, если вы не используете RxJS в любой другой части вашей программы, не импортируйте его только для этого, однако в моем случае у меня было уже импортировал и использовал RxJS в другом месте.

21
4 принят

Преимущество RxJS:

Лень

Вы можете создать свои Наблюдатели и пока не назовете, что interval/timerничего не происходит. Наблюдаемая = чистая функция. Это дает вам больше контроля, упрощает рассуждения и позволяет использовать следующий пункт ...

компонуемости

Вы можете комбинировать operatorsс другими , mapсоздавая пользовательскую логику очень легко унифицированным способом - например , вы можете repeat, retry, take, clearTimeout/clearInterval... и т.д. видеть все операторы

Обработка ошибок

В случае ошибки вы несете ответственность за вызов interval/timer- Observables обрабатывают это для вас. Результатом является более чистый код и меньше ошибок утечки памяти .

Конечно, все, что вы делаете с Observables, вы также можете обойтись без Observables - но это не главное. Обсерватории здесь, чтобы сделать вашу жизнь проще.


Также обратите внимание, что deferэто не хорошие наблюдаемые фабрики для опроса, потому что они не «ждут» вашего действия асинхронного действия (вы можете завершить несколько асинхронных вызовов, выполняющихся друг над другом). Для этого я склонен использовать repeatWhenи вот так:defer(() => doAsyncAction()) .pipe( repeatWhen(notifications => notifications.pipe(delay(1234))) );

window.setInterval

1

interval не заботятся о состоянии вашего callbacks, он будет выполняться с заданным интервалом, несмотря на статус выполнения предыдущих обратных вызовов, и единственный способ сделать это остановкой и пропустить - это очистить интервал или повторно инициализировать его.

С другой стороны, RxJS Наблюдаемых растворов на основе ( interval, timer) позволяют конвейер условных операторам ( takeWhile, skipWhileнапример) , который позволяет добавлять остановку или реализовать стоп-старт логику, просто листать булев флаг, вместо добавления сложной логики очистки интервал, а затем воссоздать его.

И они являются наблюдаемыми, вы можете слушать их по всему приложению и прикладывать к нему любое количество слушателей.

Обработка ошибок лучше, вы подписаны на все успехи и обрабатываете все в обратном вызове catch.

JavaScript, машинопись, rxjs, rxjs5, rxjs6,
Похожие вопросы
Яндекс.Метрика