Мені цікаво, яка користь від 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()
функції. The
subject
повинен бути subscriber
?
subject.next
бути рядки subscriber
. Крім того, "якщо ви повторите спробу або повторите отримане спостережуване, це не буде працювати так, як ви думаєте". Чи можете ви бути більш конкретними? Ви просто маєте на увазі new SomeWeirdDataSource()
, що відбуватиметься кожен раз, коли getData
буде викликано, і що, загортаючи його, new Observable
ви змушуєте цей екземпляр чекати, поки підписка. Думаю, я не бачу, коли ви зателефонували б getData
без a, .subscribe
тому я там втрачаю значення. Нарешті, що ви передбачаєте, щоб "зруйнувати джерело даних"? Дякую.
А Subject
може діяти як як, так observer
і як observable
.
Ан Obervable
має 2 методи.
Щоразу, коли ви підписуєтесь на observable
, ви отримуєте метод, observer
який містить наступні , помилки та повні методи.
Вам потрібно буде приховати послідовність, оскільки ви не хочете, щоб джерело потоку було загальнодоступним у всіх компонентах. Ви можете звернутися до @BenLesh
прикладу '' для того самого.
PS: Коли я вперше пройшов реактивний Javascript, я не зміг зрозуміти asObservable
. Тому що я повинен був переконатися, що я чітко розумію основи, а потім піти далі asObservable
. :)