2015-10-24 13 views
71

Myślę, że muszę się nieporozumienie coś fundamentalnego, ponieważ w moim umyśle powinien to być najbardziej podstawowy przypadek dla obserwowalne, ale dla mojego życia nie mogę dowiedzieć się, jak to zrobić z dokumentów.RxJS: Jak mogę "ręcznie" zaktualizować obserwowalne?

Zasadniczo, chcę być w stanie 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 się znaleźć sposób jak push. Używam tego dla obsługi kliknięcia i wiem, że mają do tego Observable.fromEvent, ale próbuję użyć go z React i wolałbym po prostu zaktualizować strumień danych w wywołaniu zwrotnym, zamiast używać całkowicie inny system obsługi zdarzeń. Więc w zasadzie chcę to:

$("#target").click(function(e) { 
    eventObservable.push(e.target.text()); 
}); 

Najbliżej mam używał observer.onNext('foo'), ale to nie wydaje się, że rzeczywiście działa i nazywa na obserwatora, który nie wydaje się słuszne. Obserwator powinien być tym, który reaguje na strumień danych, a nie zmienia go, prawda?

Czy po prostu nie rozumiem związku obserwatora/obserwowalnego?

+0

Spójrz na to, aby wyjaśnić swój pomysł (Wprowadzenie do programowania reaktywnego, czego Ci brakowało): https://gist.github.com/staltz/868e7e9bc2a7b8c1f754. Tutaj także jest mnóstwo zasobów, dzięki którym możesz poprawić swoje zrozumienie: https://github.com/Reactive-Extensions/RxJS#resources – user3743222

+0

Sprawdziłem pierwszy, wydaje się solidnym zasobem. Druga to świetna lista, na której znalazłem http://aaronstacy.com/writings/reactive-programming-and-mvc/, który pomógł mi odkryć Rx.Subject, który rozwiązuje mój problem. Więc dziękuję! Kiedy już napisałem nieco więcej aplikacji, opublikuję moje rozwiązanie, po prostu chcę przetestować to nieco. – LiamD

+0

Hehe, dziękuję bardzo za zadanie tego pytania, już miałem zadać to samo pytanie z myślą o tym samym kodzie :-) – arturh

Odpowiedz

88

W RX, Observer and Observable to odrębne podmioty. Obserwator subskrybuje Obserwowalny. Obserwowalne emituje przedmioty do obserwatorów, wywołując metody obserwatorów. Jeśli chcesz wywołać metody obserwatora spoza zakresu Observable.create(), możesz użyć Tematu, który jest proxy, który działa jako obserwator i jest obserwowalny w tym samym czasie.

Można zrobić tak:

var eventStream = new Rx.Subject(); 

var subscription = eventStream.subscribe(
    function (x) { 
     console.log('Next: ' + x); 
    }, 
    function (err) { 
     console.log('Error: ' + err); 
    }, 
    function() { 
     console.log('Completed'); 
    }); 

var my_function = function() { 
    eventStream.next('foo'); 
} 

można znaleźć więcej informacji na temat podmiotów tutaj:

+1

To jest dokładnie to, co zrobiłem! Pracowałem nad tym, aby sprawdzić, czy mogę znaleźć lepszy sposób na zrobienie tego, co powinienem zrobić, ale jest to zdecydowanie opłacalne rozwiązanie.Widziałem to pierwszy w tym artykule: http://aaronstacy.com/writings/reactive-programming-and-mvc/. – LiamD

+22

Po prostu notatka .. Funkcja onNext jest teraz przemianowana na "następny" –

14

wierzę Observable.create() nie przyjmuje obserwatora jako parametru zwrotnego, ale emitera. Więc jeśli chcesz dodać nową wartość do Obserwowalne spróbować zamiast:

var emitter; 
var observable = Rx.Observable.create(e => emitter = e); 
var observer = { 
    next: function(next) { 
    console.log(next); 
    }, 
    error: function(error) { 
    console.log(error); 
    }, 
    complete: function() { 
    console.log("done"); 
    } 
} 
observable.subscribe(observer); 
emitter.next('foo'); 
emitter.next('bar'); 
emitter.next('baz'); 
emitter.complete(); 

//console output 
//"foo" 
//"bar" 
//"baz" 
//"done" 

Tak Temat ułatwia, zapewniając Obserwowalne i obserwatorem tego samego obiektu, ale nie jest to dokładnie taka sama, jak Przedmiot pozwala na zasubskrybować wielu obserwatorów do tego samego obserwowalnego, gdy obserwowalne dane wysyłają tylko do ostatniego obserwowanego obserwatora, więc używajcie go świadomie. Oto JsBin, jeśli chcesz majstrować przy nim.

+0

Czy nadpisanie własności emitera jest gdzieś udokumentowane w podręcznikach RxJS? – Tomas