Me pregunto cuál es el uso de asObservable
:
Según los documentos:
Una secuencia observable que oculta la identidad de la secuencia fuente.
Pero, ¿por qué necesitarías ocultar la secuencia?
Me pregunto cuál es el uso de asObservable
:
Según los documentos:
Una secuencia observable que oculta la identidad de la secuencia fuente.
Pero, ¿por qué necesitarías ocultar la secuencia?
El propósito de esto es evitar filtrar el "lado del observador" del Asunto fuera de una API. Básicamente para evitar una abstracción con fugas cuando no desea que las personas puedan "seguir" en el observable resultante.
(NOTA: Esta no es realmente la forma en que debe convertir una fuente de datos como esta en un Observable, en su lugar, debe usar el new Observable
constructor, ver más abajo).
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();
}
};
Ahora, cuando alguien obtiene el resultado observable de myAPI.getData()
no puede next
valorar el resultado:
const result = myAPI.getData();
result.next('LOL hax!'); // throws an error because `next` doesn't exist
new Observable()
Aunque normalmente deberías usarEn el ejemplo anterior, probablemente estamos creando algo que no pretendíamos. Para uno,getData()
no es perezoso como la mayoría de los observables, creará la fuente de datos subyacente SomeWeirdDataSource
(y presumiblemente algunos efectos secundarios) de inmediato. Esto también significa que si usted retry
o repeat
el observable resultante, no funcionará como cree.
Es mejor encapsular la creación de su fuente de datos dentro de su observable así:
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();
};
});
}
Con el código anterior, cualquier comportamiento, incluso hacer que sea "no perezoso", se puede componer sobre lo observable utilizando los operadores existentes de RxJS.
result.subscribe(value => doSomething(value))
return subject.asObservable();
sería un nuevo observable. Tendría una sola variable miembro de Subject, y onMessage / onOtherMessage se declararía en una condición o en la inicialización (no en todas las llamadas). He usado ese enfoque,pipe( filter() )
basado en un parámetro proporcionado a lagetData()
función. Thesubject
supone que essubscriber
?subject.next
líneassubscriber
. Además, "si vuelve a intentarlo o repite el observable resultante, no funcionará como cree". ¿Puedes ser mas específico? ¿Quiere decirnew SomeWeirdDataSource()
que va a suceder cada vez quegetData
se llame y que al envolverlonew Observable
hace que la instanciación espere hasta una suscripción? Supongo que no veo cuándo llamaríasgetData
sin un,.subscribe
así que me falta el valor allí. Finalmente, ¿qué prevé que ocurra para "derribar la fuente de datos"? Gracias.A
Subject
puede actuar como anobserver
y anobservable
.An
Obervable
tiene 2 métodos.Cada vez que se suscribe a un
observable
, obtiene unobserver
que tiene el siguiente , error y métodos completos .Debería ocultar la secuencia porque no desea que la fuente de la transmisión esté disponible públicamente en todos los componentes. Puede consultar
@BenLesh
el ejemplo de, para el mismo.PD: Cuando vine por primera vez a través de Reactive Javascript, no pude entender
asObservable
. Porque tenía que asegurarme de entender claramente los conceptos básicos y luego seguir adelanteasObservable
. :)fuente