【问题标题】:Advanced example of RxJS5 combination with delayed observableRxJS5 与延迟 observable 组合的高级示例
【发布时间】:2017-01-19 11:10:15
【问题描述】:

嘿,我遇到了 RxJS 组合运算符的问题...

这里是示例对象:

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))

我的预期结果是带有组合 observables 的流:

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

它与withLatestFrom 运算符配合得很好:

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

但是,当我将.delay() 运算符应用于dbKeyStream 时,如何归档相同的结果?

【问题讨论】:

    标签: javascript functional-programming rxjs rxjs5


    【解决方案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>

    这为您提供了输入对象和每个输出值,可以根据需要组合在一起。

    【讨论】:

    • 谢谢,但我不能接受,因为我需要只需要一次,并使用与user相同的结果
    • 我已经更新了代码示例,让您看到对于每个dbKey,它只执行一次getDbKey(),并为users 数组中的每个用户使用此结果
    • 他们为什么将flatMap重命名为mergeMap
    • 因为名称flatMap 具有误导性。它在其实现中使用.merge() 运算符,因为.concatMap 使用.concat(),因此他们决定将其重命名为.mergeMap() 以让您知道会发生什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多