2017-01-18 5 views
-1

getLastOrder() и getUserDetails(lastOrder.owner) асинхронные операции. (оба значения возвращаются Observable)RxJS сложный zip два наблюдаемых

Ищите причудливого оператора, чтобы получить комбинированный результат, который будет включать в себя: [lastOrder, userDetails], которому принадлежит этот заказ.

P.S. делать это через временные переменные выглядит не очень хорошо

+0

Можете ли вы рассказать о том, что вы подразумеваете под действием? Является ли функция 'A' no arg, которая возвращает функцию« Observable »и« B », которая преобразует« Observable »? –

+0

Не могли бы вы дать менее абстрактный пример того, чего вы на самом деле пытаетесь достичь? – jonrsharpe

+0

извините, полностью отредактированный вопрос. – Nikita

ответ

1

Не уверен в том, что касается причудливых операторов, но это можно легко решить, объединив операторы flatMap и map. Кроме того, обратите внимание, что мои функции просто возвращают фиктивные данные, но должны работать так же, как с любым наблюдаемыми:

function getLastOrder() { 
    return Rx.Observable.of({owner: 'foo'}) 
} 

function getUserDetails(owner) { 
    return Rx.Observable.of({details: 'bar', owner}) 
} 

function combined() { 
    return getLastOrder() 
    .flatMap(order => getUserDetails(order.owner).map(details => [order, details])) 
} 

Когда вы думаете о prettyness, а также думать о следующем парне, который будет читать его.

+1

Совет: при написании '.flatmap (x => doIt (x) .map (y => [x, y])' лучше отделить ваш [resultSelector] (http://reactivex.io/rxjs/ class/es6/Observable.js ~ Observable.html # instance-method-mergeMap): '.flatmap (x => doIt (x), (x, y) => [x, y])' в качестве дополнительного бонуса вы также получить доступ к индексам 'x' и' y' –