Myślę, że muszę źle rozumieć coś fundamentalnego, ponieważ moim zdaniem to powinien być najbardziej podstawowy przypadek dla obserwowalnego, ale dla mojego życia nie mogę dowiedzieć się, jak to zrobić z dokumentacji.
Zasadniczo chcę móc to zrobić:
// create a dummy observable, which I would update manually
var eventObservable = rx.Observable.create(function(observer){});
var observer = eventObservable.subscribe(
function(x){
console.log('next: ' + x);
}
...
var my_function = function(){
eventObservable.push('foo');
//'push' adds an event to the datastream, the observer gets it and prints
// next: foo
}
Ale nie udało mi się znaleźć takiej metody push
. Używam tego do obsługi kliknięć i wiem, że mają Observable.fromEvent
do tego, ale próbuję go używać z Reactem i wolałbym móc po prostu zaktualizować strumień danych w wywołaniu zwrotnym, zamiast używać zupełnie innego system obsługi zdarzeń. Zasadniczo chcę tego:
$( "#target" ).click(function(e) {
eventObservable.push(e.target.text());
});
Najbliższy, jaki uzyskałem, był używany observer.onNext('foo')
, ale to nie wydawało się działać i to jest wezwane przez obserwatora, co nie wydaje się właściwe. Obserwator powinien reagować na strumień danych, a nie go zmieniać, prawda?
Czy po prostu nie rozumiem relacji obserwator / obserwowalny?
źródło
Odpowiedzi:
W RX, Observer i Observable to odrębne byty. Obserwator subskrybuje Observable. Observable emituje pozycje do swoich obserwatorów, wywołując metody obserwatorów. Jeśli potrzebujesz wywołać metody obserwatora poza
Observable.create()
twoim zakresem , możesz użyć Subject, który jest proxy, który działa jednocześnie jako obserwator i Observable.Możesz zrobić tak:
Więcej informacji na temat tematów można znaleźć tutaj:
źródło
Uważam,
Observable.create()
że nie przyjmuje obserwatora jako parametru wywołania zwrotnego, ale emiter. Więc jeśli chcesz dodać nową wartość do swojego Observable, spróbuj zamiast tego:Tak Temat ułatwia, zapewniając Observable i Observer w tym samym obiekcie, ale nie jest to dokładnie to samo, ponieważ Subject umożliwia przypisanie wielu obserwatorów do tego samego obserwowalnego, gdy obserwowalny wysyła dane tylko do ostatniego subskrybowanego obserwatora, więc używaj go świadomie . Oto JsBin, jeśli chcesz przy nim majstrować.
źródło
emitter
tylkonext()
nowe wartości dla obserwatora, który subskrybował ostatni. Lepszym podejściem byłoby zebranie wszystkichemitter
s w tablicy i iterowanie po nich wszystkich oraznext
wartości na każdym z nich