RxJS : Observable을 "수동으로"어떻게 업데이트합니까?


139

내 생각에 이것은 관찰 가능한 것의 가장 기본적인 경우 여야하기 때문에 나는 근본적인 것을 오해해야한다고 생각하지만, 내 인생에서는 나는 그것을 문서에서 어떻게 할 수 있는지 알 수 없다.

기본적으로 나는 이것을 할 수 있기를 원합니다.

// 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
}

그러나 나는 같은 방법을 찾지 못했습니다 push. 나는 이것을 클릭 핸들러에 사용하고 있으며, 그것들을 Observable.fromEvent위해 그것을 알고 있지만 React와 함께 사용하려고하고 있으며 완전히 다른 것을 사용하는 대신 콜백에서 단순히 데이터 스트림을 업데이트 할 수 있습니다. 이벤트 처리 시스템. 그래서 기본적으로 나는 이것을 원합니다.

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

내가 얻은 가장 가까운 것은을 사용 observer.onNext('foo')했지만 실제로는 작동하지 않는 것으로 보이며 관찰자에게 호출 된 것 같습니다. 관찰자는 데이터 스트림에 반응하는 것이지, 데이터 스트림을 변경하지 말아야합니다.

관찰자 / 관찰 가능한 관계를 이해하지 못합니까?


아이디어를 명확히하기 위해 이것을 살펴보십시오 (누락 된 반응성 프로그래밍 소개) : gist.github.com/staltz/868e7e9bc2a7b8c1f754 . 여기에 당신이 당신의 이해를 향상시킬 수있는 많은 자료가 있습니다 : github.com/Reactive-Extensions/RxJS#resources
user3743222

첫 번째를 확인했는데 견고한 리소스 인 것 같습니다. 두 번째 목록은 훌륭한 목록으로, aaronstacy.com/writings/reactive-programming-and-mvc 에서 Rx.Subject 를 발견하여 문제를 해결하는 데 도움이되었습니다. 감사합니다! 조금 더 많은 앱을 작성하면 솔루션을 게시하고 조금만 테스트하고 싶습니다.
LiamD

도니는 다르게,이 질문을 주셔서 대단히 감사합니다, 나는 :-) 마음에 매우 동일한 코드 샘플과 똑같은 질문을하고 있었다
arturh

답변:


154

RX에서 Observer와 Observable은 별개의 엔터티입니다. 관찰자는 Observable을 구독합니다. Observable은 옵저버의 메소드를 호출하여 옵저버에게 항목을 내 보냅니다. 범위 밖에서 옵저버 메소드를 호출해야하는 경우 옵저버 Observable.create()역할을하는 프록시 인 Subject를 사용할 수 있습니다.

당신은 이렇게 할 수 있습니다 :

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'); 
}

주제에 대한 자세한 정보는 여기에서 찾을 수 있습니다.


1
이것은 실제로 내가하고있는 일입니다! 나는 내가해야 할 일을하는 더 좋은 방법을 찾을 수 있는지 확인하기 위해 계속 노력했지만 이것이 실제로 가능한 해결책입니다. 이 기사에서 처음 봤습니다 : aaronstacy.com/writings/reactive-programming-and-mvc .
LiamD

34

나는 관찰자 를 콜백 매개 변수로 사용 Observable.create()하지 않고 이미 터로 생각합니다. 따라서 Observable에 새 값을 추가하려면 대신 다음을 시도하십시오.

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"

예 Subject는 Observable과 Observer를 동일한 객체에 제공하는 것이 더 쉬워 지지만, Observable이 마지막으로 구독 한 옵저버에게 데이터를 보낼 때 여러 옵저버를 동일한 옵저버 블에 구독 할 수 있으므로 정확히 동일하지는 않습니다. . 여기 에 땜질하고 싶다면 JsBin 이 있습니다.


이미 터 속성 덮어 쓰기 가능성이 RxJS 매뉴얼 어딘가에 문서화되어 있습니까?
Tomas

이 경우 emitter에만 것이다 next()마지막 관찰자에 대한 새 값 가입이. 더 나은 접근 방법은 emitter배열에서 모든 s 를 수집하고 next각각의 값 을 반복하는 것 입니다.
Eric Gopak
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.