Мне интересно, в чем польза asObservable
:
Согласно документам:
Наблюдаемая последовательность, которая скрывает идентичность исходной последовательности.
Но зачем вам скрывать последовательность?
Мне интересно, в чем польза asObservable
:
Согласно документам:
Наблюдаемая последовательность, которая скрывает идентичность исходной последовательности.
Но зачем вам скрывать последовательность?
Цель этого - предотвратить утечку "стороны наблюдателя" Субъекта из API. В основном, чтобы предотвратить дырявую абстракцию, когда вы не хотите, чтобы люди могли «переходить дальше» в получившуюся наблюдаемую.
(ПРИМЕЧАНИЕ: на самом деле это не то, как вы должны превращать такой источник данных в Observable, вместо этого вы должны использовать new Observable
конструктор, см. Ниже).
const myAPI = {
getData: () => {
const subject = new Subject();
const source = new SomeWeirdDataSource();
source.onMessage = (data) => subject.next({ type: 'message', data });
source.onOtherMessage = (data) => subject.next({ type: 'othermessage', data });
return subject.asObservable();
}
};
Теперь, когда кто-то получает наблюдаемый результат, myAPI.getData()
он не может next
оценить результат:
const result = myAPI.getData();
result.next('LOL hax!'); // throws an error because `next` doesn't exist
new Observable()
Хотя обычно вам следует использоватьВ приведенном выше примере мы, вероятно, создаем то, чего не хотели. Во-первых, getData()
он не ленив, как большинство наблюдаемых, он SomeWeirdDataSource
немедленно создаст базовый источник данных (и, предположительно, некоторые побочные эффекты). Это также означает, что если вы retry
или repeat
полученная в результате наблюдаемая, она не будет работать так, как вы думаете.
Лучше инкапсулировать создание вашего источника данных в наблюдаемом, например так:
const myAPI = {
getData: () => return new Observable(subscriber => {
const source = new SomeWeirdDataSource();
source.onMessage = (data) => subscriber.next({ type: 'message', data });
source.onOtherMessage = (data) => subscriber.next({ type: 'othermessage', data });
return () => {
// Even better, now we can tear down the data source for cancellation!
source.destroy();
};
});
}
С помощью приведенного выше кода любое поведение, в том числе «не ленивое», может быть создано поверх наблюдаемого с использованием существующих операторов RxJS.
result.subscribe(value => doSomething(value))
return subject.asObservable();
это это будет новое наблюдаемое. У вас будет одна переменная-член Subject, и onMessage / onOtherMessage будет объявлен в условии или при инициализации (не при каждом вызове). Я использовал этот подход,pipe( filter() )
основанный на параметре, передаваемомgetData()
функции. Thesubject
должно бытьsubscriber
?subject.next
быть строчкиsubscriber
. Кроме того, «если вы попытаетесь повторить или повторите полученную наблюдаемую, она не будет работать так, как вы думаете». Можете быть более конкретными? Вы просто имеете в виду, чтоnew SomeWeirdDataSource()
это будет происходить каждый раз, когдаgetData
вызывается, и что, обернув его,new Observable
вы заставляете этот экземпляр ждать до подписки. Думаю, я не понимаю, когда вы звонитеgetData
без знака,.subscribe
поэтому мне не хватает значения. Наконец, что, по вашему мнению, произойдет, чтобы «разрушить источник данных»? Благодарю.A
Subject
может действовать как как an, такobserver
и как anobservable
.У An
Obervable
есть 2 метода.Каждый раз, когда вы подписываетесь на
observable
, вы получаетеobserver
, который имеет следующую , ошибку и полные методы на нем.Вам нужно будет скрыть последовательность, потому что вы не хотите, чтобы источник потока был общедоступным в каждом компоненте. Вы можете обратиться к
@BenLesh
примеру с тем же.PS: Когда я впервые столкнулся с реактивным Javascript, я не мог понять
asObservable
. Потому что мне нужно было убедиться, что я ясно понимаю основы, а затем идти дальшеasObservable
. :)источник