Автор оригинала: Dler Ari.
Предмет – это «особый» тип наблюдаемого типа, который позволяет нам широковещать значения для нескольких подписчиков. Прохладная вещь о предметах, заключается в том, что он обеспечивает реакцию в реальном времени.
Например, если у нас есть тема с 10 абонентами, всякий раз, когда мы нажимаем значения на тему, мы можем видеть значение, захваченное каждым подписчиком
Это представляет пару вызовов; Что делать, если мы нажимаем некоторые значения, а затем подписывайтесь или на вице-стирах? Сроки играют важную роль, если мы подписываемся поздно, мы не сможем получить доступ к ценностям, аналогичным, если кто-то входит в событие в реальном времени по телевизору 30 минут.
К счастью, у нас есть 4 типа предметов, которые позволяют нам «путешествовать по времени», в котором мы можем получить доступ к значениям, хотя мы подписываемся поздно или нет.
Темы мы будем покрывать:
- Что такое субъект с практическим примером
- Поведение: получить последнее сообщение
- Replaysubject: Путешествие во времени
- AsyncSubject: После завершения, получите последнее сообщение
1. Что такое предмет?
Как уже упоминалось, предмет не более похоже на наблюдаемый с несколькими характеристиками. Наблюдаемый по определению Назыскательная коллекция который выделяет данные после подписания. Между тем субъект – это то, где мы контролируем состояние «когда выделять данные» для нескольких подписчиков.
Субъект позволяет нам вызывать методы, такие как .Next () , .Complete () и .error () Снаружи, в то время как в наблюдаемом, мы вызываем эти методы как обратные вызовы.
// Creating an Observable
const observable = new Observable((observer) => {
observer.next(10);
observer.next(5);
observer.complete();
});
// Creating a Subject
const subject = new Subject();
subject.next(10);
subject.next(5);
subject.complete();Практический пример: давайте построим простую группу чата, используя тему
Давайте представим, что мы строим простое приложение чата, где люди могут публиковать сообщения в группу чата. Первый шаг – создать экземпляр объекта, а затем назначить его на Чатегруппа Отказ
// Create subject "Observable" const chatGroup = new Subject();
Теперь, когда наша группа чата (тема) создана, следующая вещь, которую нужно сделать, это добавить сообщения. Давайте создадим типичный разговор между двумя друзьями.
// Push values to the stream
chatGroup.next('David - Hi, which hot series do you recommend?');
chatGroup.next('Peter - Game of Thrones, Bodyguard or Narcos are few of the good ones');
chatGroup.next('David - Interesting, which one is the hottest?');
chatGroup.next('Peter - Game of Thrones!');Пока так хорошо – теперь у нас есть 4 сообщения, размещенные в нашей группе чата, так что происходит, если мы подписываемся? Или, скажем, новый друг по имени Джон хочет присоединиться к разговору. Он сможет увидеть старые сообщения?
// Print messages
chatGroup.subscribe((messages) => {
console.log(messages)
})К сожалению нет, Джон не попадает в разговор, потому что он подписывается поздно. Это идеальный пример того, как работает реактивное программирование – идея значений, проходящих со временем, и, таким образом, мы должны подписаться в нужное время для доступа к значениям.
Для дальнейшего разработки на предыдущем примере, что, если Иоанн входит в середину разговора?
// Push values to the stream
chatGroup.next('David - Hi, which hot series do you recommend?');
chatGroup.next('Peter - Game of Thrones, Bodyguard or Narcos are few of the good ones');
// John enters the conversation
chatGroup.subscribe((messages) => {
console.log(messages)
});
chatGroup.next('David - Interesting, which one is the hottest?');
chatGroup.next('Peter - Game of Thrones!');
// OUTPUT
// David - Interesting, which one is the hottest?
// Peter - Game of Thrones!Как только Джон подписывается, он видит два последних сообщения. Тема делает то, что он предназначен. Но что, если мы хотим John для просмотра всех сообщений, или только последний, или получить уведомление, когда будет опубликовано новое сообщение?
В целом, эти предметы в основном похожи, но каждый из них предоставляет некоторые дополнительные функциональные возможности, давайте опишем их один за другим.
2. Поведение: получить последнее сообщение
Поведение поведения похоже на тему, за исключением того, что он требует начального значения в качестве аргумента для отмены отправной точки потока данных. Причина в том, что когда мы подписываемся, он возвращает последнее сообщение. Это аналогичная концепция при работе с массивами; где мы делаем Array.Length-1 получить последнюю ценность.
import {BehaviorSubject } from "rxjs";
// Create a Subject
const chatGroup = new BehaviorSubject('Starting point');
// Push values to the data stream
chatGroup.next('David - Hi, which hot series do you recommend?');
chatGroup.next('Peter - Game of Thrones, Bodyguard or Narcos are few of the good ones');
chatGroup.next('David - Interesting, which one is the hottest?');
chatGroup.next('Peter - Game of Thrones!');
// John enters the conversation
chatGroup.subscribe((messages) => {
console.log(messages)
})
// OUTPUT
// Peter - Game of Thrones!3. Replaysubject: Путешествие во времени
ReplaysUbject, как следует наименование, после подписания он передает все сообщения, несмотря на то, что если мы подписались поздно или нет. Это как проездное время, где мы можем получить доступ ко всем значениям, которые были транслированы.
import { ReplaySubject } from "rxjs";
// Create a Subject
const chatGroup = new ReplaySubject();
// Push values to the data stream
chatGroup.next('David - Hi, which hot series do you recommend?');
chatGroup.next('Peter - Game of Thrones, Bodyguard or Narcos are few of the good ones');
chatGroup.next('David - Interesting, which one is the hottest?');
chatGroup.next('Peter - Game of Thrones!');
// John enters the conversation
chatGroup.subscribe((messages) => {
console.log(messages)
})
// OUTPUT
// David - Hi, which hot series do you recommend?'
// Peter - Game of Thrones, Bodyguard or Narcos are few of the good ones'
// David - Interesting, which one is the hottest?'
// Peter - Game of Thrones!'4. AsyncSubject: После завершения, получите последнее сообщение
AsyncSubject аналогичен поведению поведение в терминах испускания последнего значения после подписания. Единственное отличие состоит в том, что это требует полный () Метод пометить поток как завершено. После того, как это сделано, последнее значение испускается.
import { AsyncSubject } from "rxjs";
// Create a Subject
const chatGroup = new AsyncSubject();
// Push values to the data stream
chatGroup.next('David - Hi, which hot series do you recommend?');
chatGroup.next('Peter - Game of Thrones, Bodyguard or Narcos are few of the good ones');
chatGroup.next('David - Interesting, which one is the hottest?');
chatGroup.next('Peter - Game of Thrones!');
chatGroup.complete(); // <-- Mark the stream as completed
// John enters the conversation
chatGroup.subscribe((messages) => {
console.log(messages)
})
// OUTPUT
// Peter - Game of Thrones!'Резюме
Вернуться к нашему предыдущему примеру с Джоном, теперь мы можем решить, хочу ли мы, чтобы Джон получил доступ к всему разговору (Replaysubject), последним сообщением (поведению) или последнее сообщение после завершения разговора (AsyncUbject).
Если вы когда-либо боретесь, чтобы определить, является ли субъектом правильный путь, статья « Использовать тему или не использовать тему «Дейвом Шусттон описывает, когда использовать предметы на основе двух критериев:
- Только когда кто-то хочет конвертировать Холод наблюдается в горячую наблюдаемое.
- Генерировать горячий наблюдаемый, который проходит данные непрерывно.
Короче говоря, только творчество ограничивает потенциальное использование реактивного программирования. Будут некоторые сценарии, где наблюдаемые вещи делают большую часть тяжелых подъемов, но понимают, какие предметы есть, и какой тип предметов существует, определенно улучшит ваши реактивные навыки программирования.
Если вам интересно узнать больше о веб-экосистеме, вот несколько статей, которые я написал, наслаждайтесь.
- Сравнение между угловым и реагированным
- Практическое руководство по модулям ES6
- Как выполнить HTTP-запросы с использованием API Fetch
- Важные веб-концепции для изучения
- Повысьте свои навыки с помощью этих методов JavaScript
- Создание пользовательских команд Bash
Вы можете найти меня на среднем, где я публикую еженедельно. Или вы можете следовать за мной на Twitter Где я публикую соответствующие советы по разработке веб-разработки.
Оригинал: “https://www.freecodecamp.org/news/an-introduction-to-subjects-in-reactive-programming-bbdc8fed7b6/”