Если вы хотите лениво получить store[]
из своего бэкэнда, вам придется получить их при первой подписке на this.stores
. Все остальные подписчики могут использовать те же значения, которые возвращены вашим http.get
. Для этого мы можем использовать .shareReplay()
для многоадресной рассылки всех подписчиков на один и тот же источник и заставить его воспроизводить свои предыдущие значения вместо повторного вызова http.get
function getStores() {
//return http.get<Store[]>(URL)
return Rx.Observable.from(['asdf', 'foo', 'bar']).delay(500);
}
const stores = getStores()
.do(undefined, undefined, _ => console.log('retrieved values from http backend'))
.shareReplay();
const $buttonClicks = Rx.Observable.fromEvent(document.getElementById('button'), 'click');
$buttonClicks
.do(_ => console.log('CLICKED'))
.switchMap(_ => stores
.map((val, idx) => [val, idx])
.filter(tuple => tuple[0] === 'foo')
.map(tuple => tuple[1])
)
.subscribe(
idx => console.log('got index of `foo`: ' + idx)
);
SwitchMap немного уродлив (map / filter / map), потому что в этом примере кода используется не массив, а отдельные выбросы. .toArray()
может это исправить. Зависит от того, как вы хотите использовать индекс (или значение)