Rxjs返回顺序运行的两个observable的第一个结果

时间:2017-09-25 14:03:54

标签: angular rxjs observable sequential

我需要按顺序运行两个observable并仅返回第一个observable的结果。第二个observable需要先运行才能完成。

我找到了解决方法,但我并不满意。您可以在此处进行测试:plunker test

const first = Observable.of(10).delay(1000).do(res => console.log('first'));
const second = Observable.of(20).do(res => console.log('second'));
console.log('start');
const test = first.concatMap(ev => second.map(x=> ev)).subscribe(res => 
console.log(res));

我认为(我希望!)存在一个更好的解决方案,但我找不到它。 在此先感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

我在内心将flatMap翻译成then,所以我希望能看到像...... {/ p>

const first = Observable.of(10).delay(1000).do(res => console.log('first'));
const second = Observable.of(20).do(res => console.log('second'));
const test = first.flatMap(rsp => { return second.mapTo(rsp); });

与你发布的内容并没有什么不同,但是直觉上我会更有意义,因为我不会开始考虑concat操作。

更新

我想你也可以......

const test = first.delayWhen(() => second.mapTo(0));

...但我不确定这是否更具可读性。

答案 1 :(得分:1)

我不确定,但是我认为您可以使用concatMapTo。参见示例2。 就您而言:

const first$ = of(10).pipe(delay(1000),tap(res => console.log('first')));
const second$ = of(20).pipe(tap(res => console.log('second')));

const test = first$.pipe(
  concatMapTo(
    second$,
    (first, second) => first
  )
);
test.subscribe(res => console.log(res));

https://stackblitz.com/edit/typescript-xrmsy5

如果要管理更多的可观测对象,可以使用switchMap / mergeMap。例如

const test = first$.pipe(
  // map(e => { if(e === '1') throw e; return e; } ), //throwing invalid result
  switchMap(e => second$, (f,s) => {console.log('switchMap',f,s); return f;}),
  switchMap(e => trird$, (f,s) => {console.log('switchMap', f,s); return f;}),
);

https://stackblitz.com/edit/typescript-mnsd8a

答案 2 :(得分:0)

take(1)的用户Observable.merge(first, second).take(1).subscribe(x=>console.log(x));

vars.xml

答案 3 :(得分:0)

const test = first
    .pipe(
        delayWhen(() => second)
    )
    .subscribe(() => {
        ...
    });

这应该按顺序执行第一个和第二个可观察变量,但仅在内部发出第二个可观察的结果之后才发出第一个可观察的结果。