如何切换map - 发出包含原始和新的observable的对象?

时间:2016-11-07 12:59:00

标签: javascript typescript rxjs

我想创建一个observable,它首先从异步函数中获取一个值,然后使用该值异步获取另一个值,并发出一个包含两个值的对象。

类似的东西:

function getValue1(){
    // asynchronously...
    return Observable.of(value1);
}

function getValue2UsingValue1(value1){
    // asynchronously...
    // value1 is needed to get value2...
    return Observable.of(value2);
}

getValue1()
    .switchMap(value1=> getValue2UsingValue1(value1))
    //...
    // I want to get an observable that emits an object containing value1 
    // and value2: {value1: value1, value2: value2}

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我想你可以做到:

var value1Cached = getValue1().publishReplay(1);
value1Cached.connect();
var value2 = value1Cached.concatMap(value1 => getValue2UsingValue1(value1));

Observable.forkJoin(value1Cached, value2)
    .map(values => {
        return {'value1': values[0], 'value2': values[1]};
    })
    .subscribe(val => console.log(val));

我正在使用publishReplay()运算符将此Observable转换为ConnectableObservable,其内部带有ReplaySubject以支持缓存。我想你不想两次拨打getValue1()

然后forkJoin()等待两个Observable完成并在数组中发出它们的值。

查看现场演示:https://jsbin.com/posanup/3/edit?js,console

打印到控制台:

[object Object] {
  value1: "value1",
  value2: "value2"
}