2016-10-21 3 views
0

저는 RxJS를 처음 사용하고 정신적 블록을 가지고 있습니다. 내 솔루션은 작동하지만 해킹이라는 것을 알고 있습니다. 다음을 수행하는 적절한 방법은 무엇입니까?내부 Concat Observables를 결합하십시오.

// Desired Console Log: {x: 'abcd', y: 'efgh'} 

const x = Rx.Observable.of('abcd').delay(1000); 
const y = Rx.Observable.of('efgh').delay(1000); 

Rx.Observable.concat(x,y) 
.scan((acc, cur) => { 
    if (cur.includes('a')) { 
    acc.x = cur; 
    } 
    if (cur.includes('e')) { 
    acc.y = cur; 
    } 
    return acc 
}, {x: false, y: false}) 
.filter(x => x.y === 'efgh') 
.subscribe(x => console.log(x)) 

// {x: 'abcd', y:'efgh'} 

답변

0
Rx.Observable.concat(x,y) 
    .zipIterable(['x','y'], (v1, v2) => { 
    let result = {}; 
    result[v2] = v1; 
    return result; 
    }) 
    .toArray() 
    .map(objects => Object.assign({}, ...objects)) 
    .subscribe(console.log.bind(console, '>> ')); 

주문이 유지되도록 제공, 즉 첫 번째 요소는 X 및

+0

감사합니다 번째 Y이다! .toArray()는 내가 필요한 것입니다. 왜 당신이 .zip을 사용했는지 궁금합니다. 이것은 또한 zip없이 올바른 출력을 제공합니다. –

+0

x, y뿐만 아니라 여러 개의 키가있는 경우 zip은 더 깨끗합니다. 그것은 항상 x, y, 당신의 구현을 선택하십시오 – Meir

+0

그것은 단지 X와 Y ... 지금입니다. 설명과 당신의 도움에 감사드립니다! –