Тема vs BehaviorSubject vs ReplaySubject в Угловом

Я хотел бы понять эти 3:

Тема, Предмет поведения и Тема повтора. Я хотел бы использовать их и знать, когда и почему, в чем преимущества их использования, и хотя я читал документацию, смотрел учебники и искал google, мне это не удалось понять.

Итак, какова их цель? Случай в реальном мире был бы очень признателен, что он не должен даже кодировать.

Я бы предпочел чистое объяснение не просто "a + b => c, на которое вы подписаны..."

спасибо

Ответ 1

Это действительно сводится к поведению и семантике. С

  • Subject - абонент получит только опубликованные значения, которые были выбраны после подписки. Спросите себя, это то, что вы хотите? Нужно ли подписчику знать что-либо о предыдущих значениях? Если нет, то вы можете использовать это, иначе выберите один из других. Например, при обмене компонент-компонент. Скажем, у вас есть компонент, который публикует события для других компонентов при нажатии кнопки. Вы можете использовать услугу с объектом для связи.

  • BehaviorSubject - последнее значение кэшируется. При первоначальной подписке абонент получит самое последнее значение. Семантика для этого субъекта должна представлять значение, которое изменяется со временем. Например, зарегистрированный пользователь. Первоначальный пользователь может быть анонимным пользователем. Но как только пользователь входит в систему, новое значение является аутентифицированным пользовательским состоянием.

    BehaviorSubject инициализируется с начальным значением. Это иногда важно для предпочтения кодирования. Скажем, например, вы инициализируете его null. Затем в вашей подписке вам нужно выполнить нулевую проверку. Возможно, хорошо, или, может быть, раздражает.

  • ReplaySubject - он может кэшировать до определенного количества выбросов. Все подписчики получат все кешированные значения по подписке. Когда вам понадобится такое поведение? Честно говоря, мне не нужно было такого поведения, за исключением следующего случая:

    Если вы инициализируете ReplaySubject с размером буфера 1, то он фактически ведет себя так же, как и BehaviorSubject. Последнее значение всегда кэшируется, поэтому оно действует как значение, меняющееся со временем. При этом нет необходимости в null проверке, как в случае с BehaviorSubject инициализированным null, потому что ни одно значение никогда не излучается подписчику до первого опубликования.

Таким образом, это действительно приводит к поведению, которое вы ожидаете, для чего его использовать. В большинстве случаев вы, вероятно, захотите использовать BehaviorSubject потому что то, что вы действительно хотите представить, это семантика "ценность во времени". Но я лично не вижу ничего плохого в замене ReplaySubject инициализированной 1.

То, что вы хотите избежать, это использование Subject Vanilla Subject когда вам действительно нужно какое-то поведение в кешировании. Возьмите, к примеру, вы пишете охрану маршрутизации или решение. Вы получаете некоторые данные в этом охраннике и устанавливаете его в Subject сервиса. Затем в маршрутизируемом компоненте вы подписываетесь на объект службы, чтобы попытаться получить значение, которое было выбрано в охраннике. Упс. где значение? Он уже был выпущен, DUH. Используйте тему "кеширования"!

Смотрите также:

Ответ 2

Удобная сводка различных наблюдаемых типов, не интуитивное именование, я знаю, лол.

  • Subject - подписчик получит опубликованные значения только после подписки.
  • BehaviorSubject - Новые подписчики получают последнее опубликованное значение ИЛИ начальное значение сразу после подписки.
  • ReplaySubject - Новые подписчики получают последние 1-n опубликованных значений сразу после подписки (только если они были отправлены ранее).

Ответ 3

От: Рэндалл Коутник, книга "Создание реактивных сайтов с RxJS". :

Субъект - это объект, который является наблюдаемым с турбонаддувом. По своей сути субъект действует во многом как обычная наблюдаемая, но каждая подписка подключается к одному и тому же источнику. Субъекты также являются наблюдателями и имеют методы next, error и done для отправки данных всем подписчикам одновременно. Поскольку субъекты являются наблюдателями, они могут быть переданы непосредственно в вызов подписки, и все события из исходной наблюдаемой будут отправлены через субъекта его подписчикам.

Мы можем использовать ReplaySubject для отслеживания истории. ReplaySubject записывает последние n событий и возвращает их каждому новому подписчику. Например, в приложении чата. Мы можем использовать его для отслеживания истории предыдущих чатов.

BehaviorSubject - это упрощенная версия ReplaySubject. ReplaySubject хранит произвольное количество событий, BehaviorSubject записывает только значение самого последнего события. Всякий раз, когда BehaviorSubject записывает новую подписку, он отправляет подписчику последнее значение, а также любые новые значения, которые передаются. BehaviorSubject полезен при работе с отдельными единицами состояния, такими как параметры конфигурации.

Ответ 4

  1. Субъект: при подписке он всегда получает данные, которые передаются после подписки, т.е. предыдущие отправленные значения не принимаются.
const mySubject = new Rx.Subject();

mySubject.next(1);

const subscription1 = mySubject.subscribe(x => {
  console.log('From subscription 1:', x);
});

mySubject.next(2);

const subscription2 = mySubject.subscribe(x => {
  console.log('From subscription 2:', x);
});

mySubject.next(3);

subscription1.unsubscribe();

mySubject.next(4);

В этом примере вот результат, который будет напечатан в консоли:

From subscription 1: 2
From subscription 1: 3
From subscription 2: 3
From subscription 2: 4

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

  1. Воспроизвести темы: может помочь, сохранив буфер с предыдущими значениями, который будет добавлен в новые подписки.

Вот пример использования для объектов воспроизведения, где buffer of 2 previous values сохраняется и генерируется в новых подписках:

const mySubject = new Rx.ReplaySubject(2);

mySubject.next(1);
mySubject.next(2);
mySubject.next(3);
mySubject.next(4);

mySubject.subscribe(x => {
  console.log('From 1st sub:', x);
});

mySubject.next(5);

mySubject.subscribe(x => {
  console.log('From 2nd sub:', x);
});

Вот что это нам дает на консоли:

From 1st sub: 3
From 1st sub: 4
From 1st sub: 5
From 2nd sub: 4
From 2nd sub: 5
  1. Субъекты поведения: аналогичны темам воспроизведения, но будут переиздавать только последнее переданное значение или значение по умолчанию, если ранее значение не выдавалось:
const mySubject = new Rx.BehaviorSubject('Hey now!');

mySubject.subscribe(x => {
  console.log('From 1st sub:', x);
});

mySubject.next(5);

mySubject.subscribe(x => {
  console.log('From 2nd sub:', x);
});

И результат:

From 1st sub: Hey now!
From 1st sub: 5
From 2nd sub: 5

Ссылка: https://alligator.io/rxjs/subjects/

Ответ 6

     // ***********Subject  concept ***********
    let subject = new Subject<string>();


    subject.next("Eureka");
    subject.subscribe((data) => {
      console.log("Subscriber 1 got data >>>>> "+ data);
    });
    subject.subscribe((data) => {
      console.log("Subscriber 2 got data >>>>> "+ data);
    });

       // ********behaviour subject*********
    // Behavior subjects need a first value
let subject1 = new BehaviorSubject<string>("First value");


subject1.asObservable().subscribe((data) => {
  console.log("First subscriber got data behaviour subject>>>>> "+ data);
});
subject1.next("Second value")
  • Тема. Подписчик получит опубликованные значения только после подписки.
  • BehaviorSubject - Новые подписчики получают последнее опубликованное значение ИЛИ начальное значение сразу после подписки.

Ответ 7

  • BehaviourSubject: - Используется, когда вы знаете начальное значение, которое нужно отличить.
  • ReplaySubject: - Используется, когда не задано начальное значение.