RXjs와의 반응성
11646 단어 beginnerstypescriptangular
관찰 가능 대 약속
Promise는 가져오기를 수행하고 then 메서드를 사용하여 응답을 기다릴 수 있습니다. 최근에는 응답을 처리하기 위해 async 및 await 키워드를 사용할 수 있습니다.
Observable은 다른 접근 방식을 사용합니다. 이 경우 데이터 스트림으로 작업한 다음 구독합니다. 스트림에서 새 데이터가 수신되는 즉시 구독에 알림이 표시되고 수신 데이터를 사용할 수 있게 됩니다.
정의에 따르면 약속은 한 번 호출되고 한 번 해결됩니다.
반면에 관찰 가능 항목을 사용하면 데이터를 스트리밍하고 데이터를 여러 번 보낼 수 있습니다.
Observable을 사용하면 취소할 수 있고 파이프를 사용하여 데이터 스트림을 조작할 수 있습니다.
Angular는 코어에서 observable을 사용하여 http 요청, 라우팅, 창 변경 등을 처리합니다.
RXjs
RxJS는 구독 게시자 패턴을 통해 앱 전체에서 반응성을 처리할 수 있는 라이브러리입니다.
이 기능을 구현하는 데 사용할 수 있는 공통 클래스 중 하나는 BehaviorSubject 클래스입니다.
import { Injectable } from "@angular/core";
import { BehaviorSubject } from "rxjs";
import { Product } from "./../../core/models/product.model";
@Injectable({
providedIn: "root",
})
export class CartService {
// This value is the dynamic value, we want to react to its changes
private products: Product[] = [];
// This BehaviorSubject instance defines the way reactivity is going to be hanle
private cart = new BehaviorSubject<Product[]>([]);
// Observable object consume by subscriptors
cart$ = this.cart.asObservable();
constructor() {}
addToCart(product: Product) {
// setting new value
this.products = [...this.products, product];
// sending new value to suscriptors
this.cart.next(this.products);
}
}
addToCart 메서드는 서비스를 주입하는 모든 구성 요소에서 사용할 수 있습니다.
이제 이 반응형 클래스를 어떻게 구독할 수 있습니까?
import { Component, OnInit } from '@angular/core';
import { map } from 'rxjs/operators';
import { CartService } from '@core/services/cart.service';
import { Observable } from 'rxjs';
@Component({
selector: 'app-header',
templateUrl: './header.component.html',
styleUrls: ['./header.component.scss'],
})
export class HeaderComponent implements OnInit {
total$: Observable<number>;
constructor(private cartService: CartService) {
this.total$ = this.cartService.cart$.pipe(
map((products) => products.length;)
);
}
ngOnInit(): void {}
}
switchMap을 사용하여 구독 수 줄이기
최적화하려는 코드
product: Product;
ngOnInit(): void {
this.route.params.subscribe((params: Params) => {
const id = params.id;
this.fetchProduct(id);
});
}
fetchProduct(id: string) {
this.productsService.getProduct(id).subscribe((product) => {
this.product = product;
});
}
최적화된 코드
product$: Observable<Product>;
constructor(
private route: ActivatedRoute,
private productsService: ProductsService
) {}
ngOnInit(): void {
this.product$ = this.route.params.pipe(
switchMap(
(params: Params) => this.productsService.getProduct(params.id)
)
);
}
구성 요소에서 관찰 가능 항목 사용
<div *ngIf="(product$ | async) as product">
구독 오류 처리
subscribe(successFunction, (error) => {
handlingError();
});
우리는 함수 handlingError를 사용하여 로그를 표시하거나 이벤트를 저장하거나 보초 등에 보낼 수 있습니다.
Reference
이 문제에 관하여(RXjs와의 반응성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/cyberdelahoz95/reactivity-with-rxjs-n1i텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)