2017-01-19 10 views
1

Hy, я столкнулся с проблемой с RxJS кодовых операторами ...Расширенный пример RxJS5 сочетания с замедленным наблюдаемой

здесь пример объект:

const userData = { 
     dbKeyPath: 'www.example.com/getDbKey', 
     users:[ 
      {name:'name1'}, 
      {name:'name2'}, 
      {name:'name3'} 
     ] 
    } 

Сделать наблюдаемым из них:

const userDataStream = Rx.Observable.of(userData) 
const dbKeyStream : string = this.userDataStream.mergeMap(_userData => getDbKey(_userData.dbKeyPath)) 
const userStream = this.userDataStream.pluck('users').mergeMap(_users=>Rx.Observable.from(_users)) 

Мой ожидаемый результат - поток с комбинированными наблюдаемыми величинами:

[user[0],dbKey],[user[1],dbKey],[user[2],dbKey]... 

Она работает довольно хорошо с withLatestFrom оператора:

const result = userStream.withLatestFrom(dbKeyStream) // [user, dbkey] 

Но, как я могу заархивировать такой же результат, когда я применить .delay() оператора dbKeyStream?

ответ

1

Я хотел бы предложить, используя mergeMap overload with the selectorFunc:

const userData = { 
 
     dbKeyPath: 'www.example.com/getDbKey', 
 
     users:[ 
 
      {name:'name1'}, 
 
      {name:'name2'}, 
 
      {name:'name3'} 
 
     ] 
 
    }; 
 

 
function getDbKey(path) { 
 
    return Rx.Observable.of('the-db-key:'+path) 
 
    .do(() => console.log('fetching db key for path: '+ path)) 
 
    .delay(1000); 
 
} 
 

 
const userDataStream = Rx.Observable.of(userData) 
 
    .mergeMap(
 
    _userData => getDbKey(_userData.dbKeyPath), 
 
    (_userData, dbKey) => _userData.users.map(_usr => ({ user: _usr, dbKey })) 
 
) 
 
.subscribe(console.log);
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.0.3/Rx.js"></script>

Это дает входной объект и каждое выходное значение, чтобы объединить вместе, как вам требуется.

+0

Спасибо, но я не могу принять, потому что мне нужно сделать запрос ** только один раз **, и использовать тот же результат с 'user' – huadev

+0

Я обновил пример кода, чтобы вы могли видеть, что для каждого' dbKey 'он только выполняет' getDbKey() 'один раз и использует этот результат для каждого пользователя в массиве' users' –

+0

Почему они переименовали 'flatMap' в' mergeMap'? –