2016-10-09 8 views
1

Observable을 구독하면 RxJ observables은 시간이 지남에 따라 양보되는 비동기 컬렉션입니다.배열에서 RxJs 연산자 사용

이제 RxJs 연산자를 Linq 연산자로 사용하고 싶습니다. 내 질문은 어떻게 대신 Array RxJs 연산자를 사용할 수 있습니다. 나는이 RxJS이 무엇인지 무엇인지 많은 오해라고 생각

let countMatchingMembers = (collection: Array<any>): number => { 
    // I want to use on collection instead of Rx.Observable 
    const matchingMembersObservable = Rx.Observable.from(collection) 
     .filter(p => { 
     return p.value !== null && typeof p.value !== "undefined"; 
     }); 

    return matchingMembersObservable.count() > 0; 
} 
+0

배열에 대해 정의되지 않았기 때문에 배열에 사용할 수 없습니다. 추신 :이 예제 js 배열에 이미'filter'와'length'가 내장되어 있습니다. – zerkms

+0

배열에 함수가 있음을 알고 있지만 join, flatmap, distinct와 같은 고급 연산자를 사용하고자하므로 일반적인 질문으로 묻습니다. 몇 가지 Linq 라이브러리가 있다는 것을 알고 있지만, 나는 하나의 고유 한 라이브러리로 그렇게하기를 희망했다. – Linvi

+0

그래서 배열을'Rx.Observable.from()'으로 observable로 변환 하시겠습니까? 그게 어떤 문제 야? – zerkms

답변

1

: 내가 Array 모음과 일치하는 인스턴스 수를 알고 싶습니다 예를 들어

은 특정 필터와 일치합니다. RxJS는 체인 연산자에 Linq와 같은 구문을 사용합니다. RxJS는 실제로 Observables를 Observers에 구독하기 만하면 연산자는 Array.map()과 같은 배열 함수와 같은 값을 직접 반환하지 않습니다. 이것은 RxJS (및 모든 Reactive Extension 구현)의 모든 것이 비동기임을 의미합니다.

귀하의 예와 같이 작성할 수 있습니다 :

2 

라이브 데모를 참조하십시오 : 콘솔에 인쇄

import {Observable} from 'rxjs'; 

Observable.from([4,5,9,2,7]) 
    .filter(val => val > 5) 
    .count() 
    .subscribe(result => console.log(result)); 

http://plnkr.co/edit/6IneUursxrdpLYAo6P2v 당신이 RxJS 5 그때를 사용하려고 경우

github 페이지에서만 현재 사용할 수있는 문서를 읽으시기 바랍니다. https://github.com/ReactiveX/rxjs/tree/master/doc

+0

Hello Martin, Observable이 비동기이며 동기화 작업에 사용할 수 없음을 이해합니다. RxJ 팀이 어레이 및 동기화 작업에 대해 동일한 운영자를 제공하는지 궁금합니다.당신이 그것을 할 수있게 해주고 typescript 지원을 제공하는'collectionsjs '와 같은 어떤 라이브러리를 알고 계십니까? – Linvi

+1

아니요, 이것은 RxJS의 목적이 아니므로 상황에 따라 다른 라이브러리를 찾아야 할 수도 있습니다. 나는 collectionsjs에 대한 경험이 없다. – martin

+0

정보를 제공해 주셔서 감사합니다. – Linvi

0

Martin said으로 이것은 Observables의 대상이 아닙니다. Observables은 비동기 적으로 (여러) 값에 대한 푸시 시스템을 구현합니다.

그러나 잠시 그들의 실제 목적을 무시합시다. 물론 Observables로 원하는대로 할 수 있습니다. 비동기 성질을 다루기 위해 아래 예제에서 Promise에 Observable을 래핑했습니다. 이렇게하면 일부 데이터 집합에서 내가 좋아하는 모든 연산자를 사용한 후 한 값 (!)을 반환하는 쉬운 방법이 제공됩니다. Promise의 then 기능을 사용하면 동기식 흐름을 생성 할 수 있습니다. async/await (즉시 표준화 될 때) 나는이 또한 정말 동기 방식으로 작성 될 수도 있겠죠 사용

const array = [1,2,3,4,5]; 
const promise = new Promise((resolve) => { 
    Rx.Observable.from(array) 
     .filter(x => x % 2 === 0) 
     .reduce((acc, x) => acc + x, 0) 
     .subscribe(next => resolve(next)); 
    }); 

promise 
    .then(result => console.log(result)); 

jsbin

.

하지만 다시 한 번 실험과 같습니다. 프로덕션 코드에서는 사용하지 않을 것입니다.