Что такое предмет Лука? И почему сегодня вы хотите говорить о предметах? Есть ли ошибка в издательстве? Или ты просто пьян?
Нет, ребята, не волнуйтесь, это тема дня:) Я думаю, что после этой длительной поездки в мире RXJS и после наблюдателей, наблюдателей, подписки и ряд операторов, которые я даже не помню, пришло время показать вам предметы, мощный тип наблюдаемой, но не только. Давайте начнем по определению:
Субъект похоже на наблюдаемый, но может многоадресствовать для многих наблюдателей. Субъекты похожи на Eventemitters: они поддерживают реестр многих слушателей.
Хорошо, я шучу:) Но давайте продолжим двумя примечаниями, присутствующими в официальной документации.
- Каждый предмет является наблюдаемым Учитывая тему, вы можете подписаться на него, предоставляя наблюдателя, который начнет получать значения нормально. С точки зрения наблюдателя, он не может сказать, происходит ли наблюдаемое исполнение с простой одноадресной точки зрения или субъекта.
- Каждый предмет является наблюдателем Это объект с методами Next (V), ошибка (E) и полным (). Чтобы кормить новую ценность субъекту, просто позвоните в следующем (TheValue), и он будет многоцензен, чтобы наблюдатели, зарегистрированные для прослушивания предмета.
Хорошо, но что это значит? Это означает, что вы можете создать тему, подписаться на него с инфинитивными наблюдателями, многоадресными значениями с отличной производительностью, выделяют новые значения, используя простой метод, называемый «| ». Следующий Эмит ошибок с использованием метода под названием
Ошибка И завершите свой предмет с помощью простого метода под названием
полный .
Глазурь на этом пироге состоит в том, что все эти вещи можно сделать с помощью чистого кода, и они не заключены в тело функции, как на наблюдаемом конструкторе.
Но позвольте мне показать вам пример.
import { Subject } from 'rxjs'; const subject = new Subject(); subject.subscribe({ next: (v) => console.log(new Date().toLocaleTimeString(), `observerA: ${v}`), complete: () => console.log(new Date().toLocaleTimeString(), 'observerA: complete') }); subject.next(1); setTimeout(() => { subject.subscribe({ next: (v) => console.log(new Date().toLocaleTimeString(), `observerB: ${v}`), complete: () => console.log(new Date().toLocaleTimeString(), 'observerB: complete') }); }, 2000); setTimeout(() => { subject.next(2); }, 3000); setTimeout(() => { subject.complete(); }, 4000);
18:52:23 observerA: 1 18:52:26 observerA: 2 18:52:26 observerB: 2 18:52:27 observerA: complete 18:52:27 observerB: complete
Как видите, с предметом мы можем извлечь новые значения, подписаться на его изменения и завершить тему. Я рекомендую вам попробовать этот особенный наблюдаемый, потому что он может быть мощным во многих случаях.
Библиотека RXJS не останавливает свою власть здесь. Он предоставляет нам четыре различных типа предметов: субъект, поведение, повторное, воспроизведение и асинхюбъект. Эти четыре типа имеют 4 различного поведения, которое может помочь нам разрешить разные случаи. Позвольте мне показать вам эти различия.
Субъект похоже на наблюдаемый, но может многоадресствовать для многих наблюдателей. Субъекты похожи на Eventemitters: они поддерживают реестр многих слушателей.
import { Subject } from 'rxjs'; const subject = new Subject(); subject.subscribe({ next: (v) => console.log(new Date().toLocaleTimeString(), `observerA: ${v}`), complete: () => console.log(new Date().toLocaleTimeString(), 'observerA: complete') }); subject.next(1); setTimeout(() => { subject.subscribe({ next: (v) => console.log(new Date().toLocaleTimeString(), `observerB: ${v}`), complete: () => console.log(new Date().toLocaleTimeString(), 'observerB: complete') }); }, 1000); setTimeout(() => { subject.next(2); }, 3000); setTimeout(() => { subject.complete(); }, 4000);
19:14:41 observerA: 1 19:14:44 observerA: 2 19:14:44 observerB: 2 19:14:45 observerA: complete 19:14:45 observerB: complete
Этот предмет может быть использован, когда нам нужно выделять значения и уведомить некоторые из них. Этот предмет не имеет первоначального значения, и если наблюдатель подписывается на этот тип темы, он получает только значения, излучаемые после его подписки.
N.B. В некоторых случаях нам не нужно отправлять ценность, когда мы называем следующий метод объекта, но нам просто нужно позвонить в метод, чтобы уведомить некоторые из них. В этих случаях мы можем использовать Пустотный предмет Специальная тема, которая не нуждается в стоимости.
Поведение поведении полезно для представления «ценностей со временем». Например, поток событий дня рождения является предметом, но поток возраста человека будет поведение.
import { BehaviorSubject } from 'rxjs'; const subject = new BehaviorSubject(0); subject.subscribe({ next: (v) => console.log(new Date().toLocaleTimeString(), `observerA: ${v}`), complete: () => console.log(new Date().toLocaleTimeString(), 'observerA: complete') }); subject.next(1); setTimeout(() => { subject.subscribe({ next: (v) => console.log(new Date().toLocaleTimeString(), `observerB: ${v}`), complete: () => console.log(new Date().toLocaleTimeString(), 'observerB: complete') }); }, 1000); setTimeout(() => { subject.next(2); }, 3000); setTimeout(() => { subject.complete(); }, 4000);
19:15:57 observerA: 0 19:15:57 observerA: 1 19:15:58 observerB: 1 19:16:00 observerA: 2 19:16:00 observerB: 2 19:16:01 observerA: complete 19:16:01 observerB: complete
Поведение – это предмет, который требует начального значения. Когда наблюдатель подписывается на поведение, он немедленно получает последнее исходное значение, а затем он ждет будущих значений.
ReplaysUbject записывает несколько значений от наблюдаемого выполнения и повторяет их на новые подписчики.
import { ReplaySubject } from 'rxjs'; const subject = new ReplaySubject(); subject.subscribe({ next: (v) => console.log(new Date().toLocaleTimeString(), `observerA: ${v}`), complete: () => console.log(new Date().toLocaleTimeString(), 'observerA: complete') }); subject.next(1); setTimeout(() => { subject.next(2); }, 1000); setTimeout(() => { subject.subscribe({ next: (v) => console.log(new Date().toLocaleTimeString(), `observerB: ${v}`), complete: () => console.log(new Date().toLocaleTimeString(), 'observerB: complete') }); }, 2000); setTimeout(() => { subject.next(3); }, 3000); setTimeout(() => { subject.complete(); }, 4000);
19:17:37 observerA: 1 19:17:38 observerA: 2 19:17:39 observerB: 1 19:17:39 observerB: 2 19:17:40 observerA: 3 19:17:40 observerB: 3 19:17:41 observerA: complete 19:17:41 observerB: complete
ReplaysUbject – это тема, которая не требует начального значения, но когда наблюдатель подписывается к нему, он немедленно получает все значения, уже излучаемые, и после этого он ждет будущих значений.
ASYNCUBJECT – это вариант, в котором только последнее значение наблюдаемого выполнения отправляется на его наблюдатели, и только при выполнении выполнения.
import { AsyncSubject } from 'rxjs'; const subject = new AsyncSubject(); subject.subscribe({ next: (v) => console.log(new Date().toLocaleTimeString(), `observerA: ${v}`), complete: () => console.log(new Date().toLocaleTimeString(), 'observerA: complete') }); subject.next(1); setTimeout(() => { subject.subscribe({ next: (v) => console.log(new Date().toLocaleTimeString(), `observerB: ${v}`), complete: () => console.log(new Date().toLocaleTimeString(), 'observerB: complete') }); }, 1000); setTimeout(() => { subject.next(2); }, 3000); setTimeout(() => { subject.complete(); }, 4000);
19:19:01 observerA: 2 19:19:01 observerB: 2 19:19:01 observerA: complete 19:19:01 observerB: complete
ASYNCSUBJECT является предметом, который не излучает значения, пока не будет завершено, во время его завершения он испускает последнее значение выполнено.
Это различия между этими предметами, важно помнить эти различия, потому что если вы выберете неправильный предмет, вы могли бы сделать неожиданные ошибки.
Прежде чем закончить статью позвольте мне показать вам лучшую практику, чтобы разоблачить наш предмет потребителям. Если вам нужно спрятаться к своим потребителям, что ваш наблюдаемый является предметом, вам необходимо разоблачить тему, используя свой метод «AsoBServable». Этот метод возвращает субъект в виде наблюдаемого, поэтому потребитель не может вызвать «следующие» и «полные» методы.
Хорошо, ребята, это все на сегодня, я рекомендую вам играть с этими предметами, чтобы лучше понять их силу и характеристики.
Увидимся скоро пока
Оригинал: “https://dev.to/this-is-learning/rxjs-subjects-4m12”