forkJoin替代未完成的observable?

时间:2017-07-18 16:10:02

标签: angular typescript rxjs

constructor(
    private route: ActivatedRoute,
    private http: Http
){
    // Observe parameter changes
    let paramObs = route.paramMap;

    // Fetch data once
    let dataObs = http.get('...');

    // Subscribe to both observables,
    // use both resolved values at the same level
}

是否有类似于forkJoin的内容会在发出参数更改时触发? forkJoin仅在所有可观测量完成后才有效。

我只需要避免回调地狱,任何符合要求的替代方案都是受欢迎的。

3 个答案:

答案 0 :(得分:11)

有几种选择:

  1. 使用take(1)forkJoin()完成每个来源Observable:

    forkJoin(o1$.take(1), o2$.take(1))
    
  2. 仅当所有源Observable发出相同数量的项目时,才使用zip()take(1)发出:

    zip(o1$, o2$).take(1)
    
  3. 当任何源Observable发出时,使用combineLatest()发出:

    combineLatest(o1$, o2$)
    
  4. 2019年1月:更新了RxJS 6

答案 1 :(得分:2)

除了其他答案之外,请考虑使用Observable.concat()来按顺序处理每个可观察对象。这是一个例子:

const getPostOne$ = Rx.Observable.timer(3000).mapTo({id: 1});
const getPostTwo$ = Rx.Observable.timer(1000).mapTo({id: 2});

Rx.Observable.concat(getPostOne$, getPostTwo$).subscribe(res => console.log(res));

概述6 operators you should know的好文章。

答案 2 :(得分:0)

一个小技巧,可避免在任何一个可观察对象失败时破坏可观察对象订阅。


import { throwError, of, forkJoin } from "rxjs";
import { catchError, take } from "rxjs/operators";

//emits an error with specified value on subscription
const observables$ = [];
const observableThatWillComplete$ = of(1, 2, 3, 4, 5).pipe(take(1));

const observableThatWillFail$ = throwError(
  "This is an error hence breaking the stream"
).pipe(catchError((error) => of(`Error Catched: ${error}`)));

observables$.push(observableThatWillComplete$, observableThatWillFail$);

forkJoin(observables$).subscribe(responses => {
  console.log("Subscribed");
  console.log(responses);
});