Почему я должен использовать RxJS interval () или timer (), а не window.setInterval ()? - PullRequest
0 голосов
/ 25 августа 2018

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

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

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

И когда представление уничтожено / демонтировано, яудалите интервал следующим образом:

if (this.refreshDate) {
  clearInterval(this.refreshDate);
}

Это эффективно / действенно или хлопотно?

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

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

Или

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

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


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

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

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

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

Лень

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

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

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

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

В случае ошибки вы отвечаете за вызов clearTimeout/clearInterval - Наблюдаемые обрабатывают это для вас. В результате код очистки и меньше утечки памяти ошибок.

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


Также обратите внимание, что interval/timer не являются хорошими наблюдаемыми фабриками для опроса, потому что они не "ждут" завершения вашего асинхронного действия (вы можете в конечном итоге запустить несколько асинхронных вызовов друг над другом). Для этого я обычно использую defer и repeatWhen так:

defer(() => doAsyncAction())
  .pipe(
    repeatWhen(notifications => notifications.pipe(delay(1234)))
  );
0 голосов
/ 25 августа 2018

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

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

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

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

...