MST

星途 面试题库

面试题:Angular服务异步操作中如何实现并发控制

假设在Angular服务中有多个异步任务需要同时发起,例如同时获取多个不同API的数据,但又要限制并发数量,避免因过多请求导致性能问题或资源耗尽。请阐述实现这种并发控制的思路,并使用`rxjs`相关操作符(如`forkJoin`、`concatMap`、`mergeMap`等)给出具体的代码实现示例。
41.4万 热度难度
前端开发Angular

知识考点

AI 面试

面试题答案

一键面试
  1. 实现思路

    • 首先将所有的异步任务(API请求)表示为Observable
    • 利用rxjs的操作符来控制并发数量。例如,可以使用mergeMap操作符,它会将源Observable发射的值映射为新的Observable,并将这些新的Observable发射的值合并到输出的Observable中。通过设置mergeMap的第二个参数(并发数)来限制同时执行的异步任务数量。
    • 最后使用forkJoin来等待所有任务完成,并获取所有任务的结果。
  2. 代码实现示例

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
      )
    );
  }
}

在上述代码中:

  • api1api2api3方法模拟了对不同API的请求,返回Observable
  • getDataWithConcurrencyControl方法中,将所有API请求的Observable放入数组apiCalls中。
  • 使用mergeMap操作符并设置并发数为2,这样就可以控制同时最多有2个API请求在执行。
  • 最后使用forkJoin等待所有经过mergeMap处理的Observable完成,并返回所有请求的结果数组。