Каковы различия между использованием предмета и наблюдаемого, и каковы его использование для каждого?

Я узнал о двух разных способах создания // файла сообщения A const $ = new Subject (); // файл B сообщение $ . подписаться ( ( сообщение ) => консоль . log ( message ) ); // файл C сообщение $ . next ( «Привет!» ); , Первый был с // файлом A const click $ = new Observable ( function ( observer ) { // В качестве альтернативы можно использовать Observable.create () документ . addEventListener ( 'click' , ( e ) => observer . next ( e )); }); // файл B щелкните $ . subscribe ( ( cl ) => console . log ( cl ) ); , вот так:

.next()

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

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

Observer

Основное различие, которое я могу собрать между способом Observer и способом подписки, заключается в том, что я не уверен, как иметь какое-то сообщение между некоторым файлом C, к следующим ошибкам. В принципе, щелчок $ не имеет completeметода, а методы Subject находятся в функции, которую мы передаем Observable.

Помимо этой разницы в поведении, существует ли другая разница между наблюдаемыми, полученными с классом Observable {} class Subject extends Observable {} , и теми, которые сделаны с Observable

javascript,rxjs,reactivex,

2

Ответов: 3


4 принят

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

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

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

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

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

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

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


2

Предмет реализует интерфейс Observable и Observer.

Внедрение интерфейса Observable означает, среди прочего, то, что вы можете subscribeсделать для Subject.

Реализация интерфейса Observer означает, среди прочего, что с помощью Subject вы можете вызвать методы Subscriber errorи asObservable.

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


1

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

Subject

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

const queue = new Subject();

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

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

Subjectможет скрыть свой Subscriberинтерфейс, вызвав метод - превращаясь в простой ;const stop = new Subject(); someObservable.pipe( map(x => x + 1) takeUntil(stop) ) // somewhere in my code stop.next()SubjectObservable


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

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

Subject

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

Observable

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

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

JavaScript, rxjs, reactivex,
Похожие вопросы