javascript - 如何在 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。可能是什么错误?
解决方案
这就是你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[][]>
.
推荐阅读
- sublimetext3 - 如何自动添加新行并缩进崇高文本中的反引号?
- extjs - 隐藏列时的小部件列错误
- python-3.x - 如何在 Wagtail 中为页面模型编写自定义视图?
- c# - 如何将对象的最后一个元素放入同一对象中
- firebase - 使用 Firebase ML Vision 检测图像中的点/点/圆
- binance-smart-chain - 对于 bscscan,账户中的代币余额有时是错误的
- wildfly - Wildfly 23.0.1.Final 带有 jaegertracing 异常
- javascript - 如何测试纤细的组件
- flutter - 我真的需要帮助来理解静态方法的本质
- php - 会话在带有 Ngrok URL 的 Laravel 8.12 中不起作用