2016-10-21 5 views
0

Я новичок в RxJS и имеет ментальный блок. Мое решение работает, но я знаю, что это взломать. Каков правильный способ сделать следующее?Комбинируйте внутренние конкатентные наблюдения

// 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, '>> ')); 

При условии, что порядок сохраняется, то есть первый элемент х, а второй у

+0

Спасибо! .toArray() - это то, что мне нужно. Мне любопытно, почему вы использовали .zip? Это также дает правильный выход без zip. .toArray() .map (array => ({x: array [0], y: array [1]})) –

+0

Ну, zip будет чище, если у вас много ключей, а не только x, y. Если это всегда x, y, я бы выбрал вашу реализацию. – Meir

+0

Это только X и Y ... пока. Спасибо за объяснение и вашу помощь! –

Смежные вопросы