📜  如何在 Angular http 中正确使用 observable - Javascript (1)

📅  最后修改于: 2023-12-03 15:08:33.615000             🧑  作者: Mango

如何在 Angular Http 中正确使用 Observable

在 Angular 应用中,我们经常要使用 Http 模块来请求数据。而在处理异步操作时,我们通常使用 Observable 来处理异步数据流。但是,如果不正确使用 Observable,将会导致代码出现一些奇怪的错误。

本文将介绍如何在 Angular Http 中正确使用 Observable,以确保应用程序的稳定性和可靠性。

使用 Observable 发送 Http 请求

在 Angular 中使用 Http 模块发送 Http 请求非常简单。我们只需要调用 http.get()http.post() 等方法即可。

但是,在 Angular 的 Http 模块中,这些方法并不直接返回数据,而是返回 Observable 对象,因为 Http 请求是异步的,Observable 可以让我们更好地处理异步数据流。

以下是一个使用 Observable 发送 Http 请求的例子:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root',
})
export class DataService {
  constructor(private http: HttpClient) {}

  getData(): Observable<any> {
    return this.http.get<any>('https://jsonplaceholder.typicode.com/todos');
  }
}

在上面的代码中,我们使用 HttpClient 发送 Http 请求,并将返回的 Observable 对象作为函数的返回值。

对 Observable 进行订阅并处理数据

在上面的例子中,我们已经成功发送了 Http 请求并得到了 Observable 对象。但是,我们还需要对 Observable 进行订阅,并处理它发出的值。

以下是一个基本的 Observable 订阅示例,以获取数据并将其转换为固定类型:

import { Component, OnInit } from '@angular/core';
import { DataService } from './data.service';
import { Observable } from 'rxjs';

@Component({
  selector: 'app-root',
  template: '{{data | json}}', // 将数据以 JSON 格式输出到模板中
})
export class AppComponent implements OnInit {
  data$: Observable<any>;

  constructor(private dataService: DataService) {}

  ngOnInit(): void {
    this.data$ = this.dataService.getData();
    this.data$.subscribe((data) => {
      this.data = data;
    });
  }
}

在上面的例子中,我们先使用 getData() 方法获取 Observable 对象,然后通过 subscribe() 方法对其进行订阅,并将 Observable 发出的数据传递给回调函数。

处理错误并显示错误信息

使用 Http 请求时,错误处理尤为重要。我们必须确保处理所有可能出现的错误,并向用户显示错误信息。

以下是一个处理错误并向用户显示错误信息的示例:

import { Component, OnInit } from '@angular/core';
import { DataService } from './data.service';
import { Observable, throwError } from 'rxjs';
import { catchError } from 'rxjs/operators';

@Component({
  selector: 'app-root',
  template: `
    <div *ngIf="error" class="alert alert-danger">{{ error }}</div>
    <ul>
      <li *ngFor="let item of data">{{ item.title }}</li>
    </ul>
  `,
})
export class AppComponent implements OnInit {
  data$: Observable<any>;
  data: any[];
  error: string;

  constructor(private dataService: DataService) {}

  ngOnInit(): void {
    this.data$ = this.dataService.getData().pipe(
      catchError((err) => {
        this.error = 'Error occurred while fetching data!';
        return throwError(err);
      })
    );
    this.data$.subscribe((data) => {
      this.data = data;
    });
  }
}

在上面的代码中,我们使用 catchError() 操作符来捕捉发生的错误,并将错误信息存储在 error 变量中。然后,我们使用 ngIf 来控制错误消息的显隐性。

通过完整的 Http 请求生命周期管理 Observable

在 Angular 应用中,我们通常需要对 Http 请求进行更准确和可扩展的控制。Http 请求生命周期提供了这样的控制。

以下是一个管理 Http 请求生命周期的示例:

import { Injectable } from '@angular/core';
import {
  HttpClient,
  HttpRequest,
  HttpHandler,
  HttpEvent,
  HttpResponse,
  HttpErrorResponse,
} from '@angular/common/http';
import { Observable, throwError } from 'rxjs';
import { catchError, map } from 'rxjs/operators';

@Injectable({
  providedIn: 'root',
})
export class DataService {
  constructor(private http: HttpClient) {}

  getData(): Observable<any> {
    const req = new HttpRequest('GET', 'https://jsonplaceholder.typicode.com/todos');
    return this.http.request(req).pipe(
      map((event: HttpEvent<any>) => {
        if (event instanceof HttpResponse) {
          return event.body;
        }
      }),
      catchError((err: HttpErrorResponse) => throwError(err.message))
    );
  }
}

在上面的代码中,我们创建了一个 HttpRequest 对象,并使用 request() 方法将其传递给 HttpClient 对象。然后,我们使用 Observablepipe() 方法来添加一些操作符以对 Http 响应进行更准确的控制。

总结

在 Angular 应用中,正确处理异步数据流和错误处理是至关重要的。使用 Observable 来处理 Http 请求可以让我们更好地控制数据流,并及时处理错误信息。