Каковы различия между использованием Субъекта и Наблюдаемого, и как они используются для каждого? - PullRequest
0 голосов
/ 25 августа 2018

Я узнал о двух разных способах сделать Наблюдаемый. Первый был с темой, вот так:

// file A
const message$ = new Subject();

// file B
message$.subscribe( (message) => console.log(message) );

// file C
message$.next("Hello there!");

Этот метод создания Observable позволяет мне иметь возможность обмениваться данными из файла B в файл C.

Второй способ - через класс Observable, например:

// file A
const click$ = new Observable( function(observer) { 
  //Alternatively, I can use Observable.create()
  document.addEventListener('click', (e) => observer.next(e));
});

// file B
click$.subscribe( (cl) => console.log(cl) );

Основное различие, которое я могу собрать между способом Subject и Observable, заключается в том, что я не уверен, каким образом можно установить какую-то связь между каким-либо файлом C и подписчиками Observable. По сути, у click $ нет метода .next(), а методы-наблюдатели находятся в функции, которую мы передаем наблюдаемой.

Кроме этой разницы в поведении, есть ли еще одна разница между наблюдаемыми, сделанными с помощью субъекта, и наблюдаемыми, сделанными с помощью наблюдаемой

Ответы [ 3 ]

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

Соотношение между Subject и Observable выглядит следующим образом:

class Observable {}

class Subject extends Observable {}

Subject реализует Subscriber интерфейс. Таким образом, вы можете использовать Subject как Subscriber (Observable не может использоваться таким образом):

const subj = new Subject()
observable.subscribe(subj)

Subject может скрыть свой Subscriber интерфейс, вызвав метод asObservable - превратив Subject в обычный Observable;


Я обычно использую Subject, когда мой код будет генерировать события, и я использую Observable, когда у меня уже есть какой-то источник событий

Например, используя Subject в качестве очереди:

const queue = new Subject();

queue.pipe(
  concatMap(doStuff)
).subscribe()

queue.next('do this')
queue.next('do that')

или использование субъекта в качестве сигнализатора для остановки других наблюдаемых

const stop = new Subject();

someObservable.pipe(
  map(x => x + 1)
  takeUntil(stop)
)

// somewhere in my code
stop.next()

Кроме этой разницы в поведении, есть ли еще одна разница между наблюдаемыми, сделанными с помощью субъекта, и наблюдаемыми, сделанными с помощью наблюдаемой

Я бы не сказал, что есть различия - это больше похоже на Subject, дополняющий обычный Observable - позволяющий нам делать больше вещей, когда это необходимо.

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

A Subject означает одновременно Observable и Observer. Это делает его настолько заманчивым в использовании, потому что вы получаете ссылку на Observer, которую вы можете передавать в своем коде и генерировать элементы из любого места, где вы хотите. Однако это значительно увеличивает вероятность ошибок в вашем коде, поскольку вы переходите от декларативного определения Observable к императивному.

Вообще говоря, вы должны использовать наблюдаемые функции создания ( из , из , create ), где это возможно. Я бы сказал, что большинство дел можно решить без предметов. Тем не менее, существует крутая кривая обучения, поскольку вы должны познакомиться с большинством наблюдаемых функций создания, чтобы следовать этому шаблону.

Тема может быть более естественной для разработчиков, которые привыкли к обязательному кодированию (то есть с использованием языка сценариев, такого как JS), так как он напоминает простой объект-оболочку для функции обратного вызова. И кто-то может спросить, почему субъект так или иначе существует, если это нежелательно.

Согласно этой статье предметы должны использоваться только в одном случае:

Для генерации горячей наблюдаемой обязательно и без состояний без какого-либо прямого внешнего источника.

Короче говоря, это означает: используйте Subject, если у вас нет внешнего источника (например, Observable, Promise или Event) и вам необходимо многоадресно передать состояние класса изнутри функции. Вы не должны подвергать эту тему другим, хотя!

Предлагаю вам прочитать эту статью, она прояснит ситуацию.

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

Субъект реализует интерфейс Observable и Observer.

Реализация интерфейса Observable означает, среди прочего, что вы можете subscribe для субъекта.

Реализация интерфейса Observer означает, среди прочего, что с субъектом вы можете вызывать методы next error и complete.

Вы создаете Observables, используя Subject, в том случае, если вы хотите программно управлять потоком событий этого Observable, как вы упомянули при управлении связью между C и B .

...