12

fromArray Rx wiki on githubrx.js를 사용하여 어레이에 추가 된 것을 관찰 할 수 있습니까?

coffee> rext = require 'rx'             
coffee> arr = [1..5]             
[ 1, 2, 3, 4, 5 ]              
coffee> obs = rext.Observable.fromArray(arr)       
{ _subscribe: [Function] }           
coffee> obs.subscribe((x) -> console.log("added value: " + x))  
added value: 1              
added value: 2              
added value: 3              
added value: 4              
added value: 5              
{ isStopped: true,             
    observer:               
    { isStopped: true,             
    _onNext: [Function],            
    _onError: [Function: defaultError],        
    _onCompleted: [Function: noop] },        
    m: { isDisposed: true, current: null } }       
coffee> arr.push(12) # expecting "added value: 12"            
6      # instead got new length of array            
coffee>   

은 정말에만 불 한 번,이 만들어지는 것이다 subscribe 기능처럼 보인다. 내가 진짜로 단지 변화를 관찰하는 대신에 배열을 각각 사용하기 때문에 그것은 다소 잘못된 이름 인 것 같다. 이 코드는 위키에있는 코드와 거의 동일합니다. 그래서 내가 잘못했거나 subscribe이 내가 예상 한대로 작동하지 않습니다.

답변

1

Observable.fromArray는 구독자를 추가 할 때 각 배열 항목에 대한 이벤트를 즉시 발생시키는 Observable을 만듭니다. 그래서, 그것은 그 배열에 대한 변화를 "지켜 보지"않을 것입니다.

"밀어 넣기 가능한 모음"이 필요한 경우 Bacon.js의 Bus 클래스가 원하는 것일 수 있습니다. RxJ의 경우 유사한 기능을 가진 작은 MessageQueue 클래스가 있습니다.

+4

는 그래서 ...하지 않는 관찰자입니다. 누가이 물건을 생각해 내죠? (수사학). MessageQueue에 대한 팁 주셔서 감사합니다. – jcollum

+0

아, 그러면 실제로 JS 개체에 대해 관찰 가능한 바인딩을 제공하는 FRB (http://documentup.com/montagejs/frb/)가 있습니다. 또는 적어도 객체의 속성. 배열을 직접 관찰하는 것에 대해서는 확실하지 않습니다. – raimohanska

+1

RxJS가 "주제"라는 상자를 기본적으로 제공하는 다른 라이브러리를 사용하는 것은 내 관점에서 좋은 접근법이 아닙니다. – TekTimmy

2

내가 예상했던대로 Rx.Observable.ofObjectChanges(obj)이 작동합니다. 문서 페이지에서

:

는 Object.observe를 사용하여 객체에 대한 변경에서 관찰 가능한 순서를 작성합니다.

희망이 있습니다.

+0

OP가 배열에 관한 것이기 때문에 아마도 ofArrayChanges를 사용해야합니다 ... – Lucas

+3

ofObjectChanges는 RxJS 5에서 더 이상 사용할 수 없습니다 : https://github.com/ReactiveX/rxjs/blob/master/MIGRATION.md – kpup

10

RxJS에서 찾고있는 것은 Subject입니다. 데이터를 데이터로 푸시하고 거기에서 스트리밍 할 수 있습니다.

Subject getting started guide
  • Subject API docs
    • .

    예 :

    var array = []; 
    var arraySubject = new Rx.Subject(); 
    
    var pushToArray = function (item) { 
        array.push(item); 
        arraySubject.next(item); 
    } 
    
    // Subscribe to the subject to react to changes 
    arraySubject.subscribe((item) => console.log(item)); 
    
  • +0

    무엇입니까? 귀하의 예를 들어'배열'? @Frederik –

    +1

    요소를 포함하는 실제 배열입니다. 요소를 배열에 푸시하면 arraySubject에서 next()도 호출되므로 구독자에게 알릴 수 있습니다. 물론 자신의 클래스에 직접 빌드 할 수도 있습니다. –

    +0

    이게 어떻게 작동할까요? 제목을 구독하는 경우 이미 배열에 푸시 된 요소를 관찰하지 않을 것입니다. 맞습니까? –