首页 > 解决方案 > 如何在 rxjs 中连接流?

问题描述

我正在尝试使用 rxjs 从服务器获取数据:

class HolidaysService {
    constructor() {
        this.restService = newRestService();
    }

    public getHolidaysByYear(year: number): Observable<Date[]> {
        const endpoint = `/get${year}`;
        return this.restService.GET(endpoint, { cache: true })
            .pipe(map(dates: any)=> dates.map((item: string) => new Date(item)))
    }

    public getHolidaysByYears(years: number[]): Observable<Date[]> {
        const requests = years.reduce((acc,v)=>acc.concat(this.getHolidaysByYear(v)),[])
        return forkJoin(...requests).pipe(scan((acc,v)=>acc.concat(v), []))
    }

}

// We call it:
const holidayService = new HolidaysService();
const substriction1 = holidayService.getHolidaysByYear(2020)
    .subscribe(
        res => console.log('res', res),
        err => console.warn(err)
    );
substriction1.unsunscribe();

控制台显示 res 和数据本身。现在我想使用 promise.all 的 rxjs-analogue 来获取几年的信息:

const substriction2 = holidayService.getHolidaysByYears([2019,2020])
    .subscribe(
        res => console.log('res', res),
        err => console.warn(err)
    );
substriction2.unsunscribe();

没有任何效果。我在控制台和数据中看不到 res。可能是什么错误?

标签: javascriptrxjs

解决方案


这就是你Promise.all在 RxJS 中编写模拟的方式forkJoin

public getHolidaysByYears(years: number[]): Observable<Date[]> {
    const requests = years.map(year => this.getHolidaysByYear(year));
    return forkJoin(requests).pipe(concatAll());
}

请注意,我使用的是concatAll运算符,因为forkJoin(requests)会给你Observable<Date[][]>,即每年的假期日期数组。由于您的返回类型是Observable<Date[]>,这就是为什么我使用concatAll运算符来连接结果数组并获取Observable<Date[]>而不是Observable<Date[][]>.


推荐阅读