如何使用 mergeMap 和 forkJoin 在 Angular 中处理多个 API 请求
在本文中,我将探讨如何在 Angular 中处理多个 API 请求。在现代 Web 开发中,处理 Angular 中的多个 API 请求是一种常见的场景。为了避免诸如嵌套订阅之类的问题,实现一个高效且可维护的解决方案至关重要。在本文中,我们将探索如何使用 Angular RxJS 库中的mergeMap和forkJoin运算符来正确处理多个 API 请求。
首先我来解释一下这个问题。
因为我们没有使用嵌套订阅
在现实世界中,我们的 Web 应用程序中经常会进行多个 API 调用。导航到页面时,通常需要从各种 API 中检索数据。在 Angular 中,subscribe 运算符通常用于从单个 API 调用中获取数据。但是,在处理多个 API 调用时,有更有效的方法来实现这一点。我们可以先使用subscribe运算符解决这个问题,然后再利用mergeMap和forkJoin进行改进。
订阅()
通常情况下,这种技术非常简单。然而,当我们为call()的 Observable 发出的每个值都触发一个新的订阅时,可能会导致创建大量未处理的 Observable 和订阅。所有这些实体都会暂时保留在内存中,从而导致潜在的问题。以下是嵌套订阅的示例。
export class DevToComponent implements OnInit {
    todoValue: string = '';
    comment: any;
    constructor(private http: HttpClient) { }
    ngOnInit(): void {
        this.retrieveDefaultData();
    }
    retrieveDefaultData(): void {
        this.http.get('https://jsonplaceholder.typicode.com/posts/1')
            .pipe(map(todo => todo[0]))
            .subscribe(
                todo => {
                    this.todoValue = todo;
                    this.http.get(`https://jsonplaceholder.typicode.com/posts/${this.todoValue}/comments`)
                        .subscribe(
                            coment => {
                                this.comment = coment;
                            }
                        );
                }
            )
    }
}
需要注意的是,当你多次subscribe()一个 Observable 时,你的订阅者不会监听同一个源。相反,每次订阅都会触发一个已定义的Observable管道的新副本。
合并映射()
该运算符接受输入可观察值,将转换函数应用于每个发出的值,并将结果可观察值合并为单个输出可观察值。通过使用MergeMap(),我们可以避免嵌套订阅,并实现更简化、更高效的处理异步请求的方法。
当我们需要从第一个 API 请求到第二个 API 请求的数据信息时,我们可以使用 MergeMap():
export class DevToComponent implements OnInit {
    todoValue: string = '';
    comment: any;
    mergeMapResult: any;
    constructor(private http: HttpClient) { }
    ngOnInit(): void {
        this.retrieveDefaultData();
    }
    retrieveDefaultData(): void {
        this.http.get('https://jsonplaceholder.typicode.com/posts/1')
            .pipe(
                map(todo => {
                    return todo
                }),
                mergeMap(todo => this.http.get(`https://jsonplaceholder.typicode.com/posts/${todo}/comments`))
            ).subscribe(response => {
                this.mergeMapResult = response;
            })
    }
}
使用 mergeMap 可以避免嵌套订阅,从而简化异步操作。由于操作按顺序执行,而不是嵌套多个订阅回调,因此代码更加简洁易读。
ForkJoin()
此运算符,当您有多个彼此独立的并行 API 请求,并且您想等待所有请求完成后再采取进一步操作时,您可以使用forkJoin()运算符而不是嵌套订阅。
我们可以使用 ForkJoin() 调用独立的多个 API 请求:
export class DevToComponent implements OnInit {
    todoValue: string = '';
    comment: any;
    firstApiResult: any;
    secondApiResult: any;
    constructor(private http: HttpClient) { }
    ngOnInit(): void {
        this.retrieveDefaultData();
    }
    retrieveDefaultData(): void {
        const firstAPI = this.http.get('https://jsonplaceholder.typicode.com/posts/1')
        const secondAPI = this.http.get(`https://jsonplaceholder.typicode.com/posts`)
        forkJoin([firstAPI, secondAPI]) //we can use more that 2 api request 
            .subscribe(
                result => {
                    //this will return list of array of the result
                    this.firstApiResult = result[0];
                    this.secondApiResult = result[1];
                }
            )
    }
}
使用 forkJoin() 可以简化并行 API 请求的处理,因为它提供了一种简洁高效的方法来等待所有请求完成。它消除了嵌套订阅的需要,从而提高了代码的可读性和可维护性。
注意:如果 forkJoin() 中的任何源 Observable 在完成之前发生错误,整个 Observable 都会出错,并且不会发出任何结果。因此,在使用 forkJoin() 时,妥善处理错误情况非常重要。
结论:
 通过在 RxJS 中使用 mergeMap() 和 forkJoin(),您获得了一种强大的技术来处理多个 API 请求,而无需依赖嵌套订阅。这种方法不仅提高了代码的可读性和可维护性,而且还允许高效地并行执行异步操作。
感谢您阅读整个故事❤
文章来源:https://dev.to/mana95/how-to-use-mergemap-and-forkjoin-to-handle-multiple-api-requests-in-angular-412p 后端开发教程 - Java、Spring Boot 实战 - msg200.com
            后端开发教程 - Java、Spring Boot 实战 - msg200.com