typescript 在Angular中,我需要帮助管理来自服务的API调用的加载/错误状态,以及一般代码结构方面的帮助

wljmcqd8  于 2023-01-27  发布在  TypeScript
关注(0)|答案(1)|浏览(116)

我建立一个应用程序,我需要一点指导方面的应用程序结构和逻辑我非常感谢任何帮助!
因此,在应用程序中,我调用服务器并从那里获取文档(包裹),现在我想尽可能减少调用的数量,因为我认为这将提高我的应用程序性能。我对吗?我将获取所有文档,然后做任何过滤/拼接或任何需要在客户端每次包裹被删除等,我尝试了服务器端处理(例如,服务器端删除包裹,并在删除后返回更新的包裹数组)但这相当慢,因为包裹数组相当大,并且调用mongoDB,因此也需要时间(特别是非“onstock”的)。所以我的想法是在服务初始化后立即调用API并存储包裹(并且还存储另一个数组,其中只包含库存的包裹)在Subjects中。但是我有一个问题,
1.我不知道如何显示错误/加载屏幕以获得适当的用户体验,因为我的API调用是在服务中,所以我厌倦了创建一个表示加载状态的主题(我在组件中使用它来显示加载微调控制器),但现在我还需要一个表示错误状态的主题(如果API调用有错误,我想将其显示给用户),这变得很麻烦,
2.in 该服务将有更多的方法,他们将不得不操纵包裹主题以及,所以我想知道我是否应该订阅在一个顶级组件,并钻取主题内的子组件或我可以只订阅子组件多次,它不会影响性能?
对不起,因为我缺乏最佳实践知识的长职位。
服务代码:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { BehaviorSubject} from 'rxjs';
import { Parcel } from 'src/app/models/Parcel.model';

@Injectable({
  providedIn: 'root',
})
export class ParcelsService {
  apiUrl: string = 'http://localhost:5000';

  allParcels$ = new BehaviorSubject<Parcel[]>([]);
  stockParcels$ = new BehaviorSubject<Parcel[]>([]);
  isLoading$ = new BehaviorSubject<boolean>(true);

  constructor(private http: HttpClient) {
    this.http.get<Parcel[]>(`${this.apiUrl}/parcels`).subscribe((response) => {
      this.allParcels$.next(response);
      this.stockParcels$.next(
        response.filter((parcel) => parcel.isOnStock === true)
      );
    });
    this.isLoading$.next(false)
  }



}

当前使用主题的唯一组件(将有更多)

import { Component, OnInit, OnDestroy } from '@angular/core';
import { ParcelsService } from 'src/app/services/parcels/parcels.service';
import { Parcel } from 'src/app/models/Parcel.model';
import { Subject, Subscription, takeUntil } from 'rxjs';

@Component({
  selector: 'app-parcels-management-page',
  templateUrl: './parcels-management-page.component.html',
  styleUrls: ['./parcels-management-page.component.css'],
})
export class ParcelsManagementPageComponent implements OnInit, OnDestroy {
  private ngUnsubscribe = new Subject<void>();

  isFetching = true;
  allParcels: Parcel[] = [];
  stockParcel: Parcel[] = [];

  constructor(private parcelsService: ParcelsService) {}

  ngOnInit(): void {
    this.parcelsService.isLoading$
      .pipe(takeUntil(this.ngUnsubscribe))
      .subscribe((response) => {
        this.isFetching = response;
        console.log(this.isFetching);
      });

    this.parcelsService.allParcels$
      .pipe(takeUntil(this.ngUnsubscribe))
      .subscribe((response) => {
        this.allParcels = response;
        console.log(this.allParcels);
      });
    this.parcelsService.stockParcels$
      .pipe(takeUntil(this.ngUnsubscribe))
      .subscribe((response) => {
        this.stockParcel = response;
        console.log(this.stockParcel);
      });
  }

  ngOnDestroy() {
    this.ngUnsubscribe.next();
    this.ngUnsubscribe.complete();
  }
}
mkshixfv

mkshixfv1#

在应用中管理状态、处理错误和加载屏幕的一种方法是使用类似ngrx的库。Ngrx是一个为Angular应用实现Redux模式的库,它允许更好地管理全局状态。您可以使用ngrx在商店中存储您的包裹和库存包裹,并使用操作和简化器处理加载和错误状态。

相关问题