面试题答案
一键面试-
实现思路:
- 首先将所有的异步任务(API请求)表示为
Observable
。 - 利用
rxjs
的操作符来控制并发数量。例如,可以使用mergeMap
操作符,它会将源Observable
发射的值映射为新的Observable
,并将这些新的Observable
发射的值合并到输出的Observable
中。通过设置mergeMap
的第二个参数(并发数)来限制同时执行的异步任务数量。 - 最后使用
forkJoin
来等待所有任务完成,并获取所有任务的结果。
- 首先将所有的异步任务(API请求)表示为
-
代码实现示例:
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable, forkJoin } from 'rxjs';
import { mergeMap } from 'rxjs/operators';
@Injectable({
providedIn: 'root'
})
export class DataService {
constructor(private http: HttpClient) {}
// 模拟多个API请求,返回Observable
private api1(): Observable<any> {
return this.http.get('/api1');
}
private api2(): Observable<any> {
return this.http.get('/api2');
}
private api3(): Observable<any> {
return this.http.get('/api3');
}
// 控制并发获取数据
getDataWithConcurrencyControl(): Observable<any[]> {
const apiCalls = [this.api1(), this.api2(), this.api3()];
return forkJoin(
apiCalls.pipe(
mergeMap((apiCall, index) => apiCall, 2) // 这里设置并发数为2
)
);
}
}
在上述代码中:
api1
、api2
、api3
方法模拟了对不同API的请求,返回Observable
。getDataWithConcurrencyControl
方法中,将所有API请求的Observable
放入数组apiCalls
中。- 使用
mergeMap
操作符并设置并发数为2,这样就可以控制同时最多有2个API请求在执行。 - 最后使用
forkJoin
等待所有经过mergeMap
处理的Observable
完成,并返回所有请求的结果数组。