목차
Observable(관찰 가능 개체)
observer(观察者)
구독
订阅者函数
多播
RxJS操作符
错误处理
웹 프론트엔드 JS 튜토리얼 Angular의 관찰 가능한 객체, 관찰자 ​​및 RxJS 연산자에 대한 간략한 분석

Angular의 관찰 가능한 객체, 관찰자 ​​및 RxJS 연산자에 대한 간략한 분석

Jan 10, 2022 pm 07:10 PM
angular 주목할 만한

이 글은 Angular의 Observable, Observer 및 RxJS 연산자를 소개합니다.

Angular의 관찰 가능한 객체, 관찰자 ​​및 RxJS 연산자에 대한 간략한 분석

Observable(관찰 가능 개체)

Observable(관찰 가능 개체)은 RxJS 라이브러리의 개체로, 다음과 같은 비동기 이벤트를 처리하는 데 사용할 수 있습니다. HTTP 요청(실제로 Angular에서는 모든 HTTP 요청이 Observable을 반환합니다). [관련 튜토리얼 추천: "Observable(可观察对象),是RxJS库里面的一个对象,可以用来处理异步事件,例如HTTP请求(实际上,在Angular中,所有的HTTP请求返回的都是Observable)。【相关教程推荐:《angular教程》】

或许,你以前接触过一个叫promise的东西,它们本质上面是相同的:都是生产者主动向消费者“push”产品,而消费者是被动接收的,但是他们两者还是有很大区别的:Observable可以发送任意多值,并且,在被订阅之前,它是不会执行的!这是promise不具备的特点。

  • Observable用于在发送方和接收方之间传输消息,你可以将这些消息看成是流
  • 在创建Observable对象时,需要传入一个函数作为构造函数的参数,这个函数叫订阅者函数,这个函数也就是生产者向消费者推送消息的地方
  • 在被消费者subscribe(订阅)之前,订阅者函数不会被执行,直到subscribe()函数被调用,该函数返回一个subscription对象,里面有一个unsubscribe()函数,消费者可以随时拒绝消息的接收!
  • subscribe()函数接收一个observer(观察者)对象作为入参
  • 消息的发送可以是同步的,也可以是异步的

observer(观察者)

有了可观察对象(发送方),就需要一个观察者(接收方)来观察可观察对象,观察者要实现observerangular tutorial

"]아마도 promise라는 것을 접하셨을 것입니다. 둘 다 본질적으로 동일합니다. 두 생산자는 적극적으로 소비자에게 "제품을 푸시"하지만, 소비자는 이를 수동적으로 수신하지만 여전히 큰 차이가 있습니다. Observable은 원하는 수의 값을 보낼 수 있지만 실행되지는 않습니다! promise에는 없는 기능입니다.
  • Observable은 발신자와 수신자 간에 메시지를 전송하는 데 사용됩니다. Observable 를 생성할 때 이러한 메시지를 스트림으로 간주할 수 있습니다. > 객체의 경우 생성자의 매개변수로 함수를 전달해야 합니다. 이 함수를 구독자 함수라고 합니다. 이 함수는 생산자가 소비자에게 메시지를 푸시하는 위치입니다.
  • 소비자가 subscribe(구독)하면 구독자 함수는 subscribe() 함수가 호출되어 subscription 을 반환할 때까지 실행되지 않습니다. unsubscribe() 함수가 포함된 개체를 사용하면 소비자는 언제든지 메시지 수신을 거부할 수 있습니다!
  • subscribe() 함수는 observer 개체를 입력 매개변수로 받습니다.
  • 메시지 전송은 동기식일 수 있습니다. 비동기식일 수 있습니다.
다음필요합니다. 수신된 값을 입력 매개변수로 사용하여 정상적인 상황에서 실행합니다. 0회 이상 실행될 수 있습니다. error선택사항. 오류가 발생한 경우 실행됩니다. 오류로 인해 관찰 가능한 객체 인스턴스의 실행이 중단됩니다. 완료선택사항. 전송이 완료되면 실행됩니다.

구독

누군가가 Observable 인스턴스를 구독하는 경우에만 값 게시가 시작됩니다. 구독할 때 먼저 관찰 가능한 객체의 subscribe() 메서드를 호출하고 이를 관찰자 객체에 전달하여 알림을 받아야 합니다. 다음과 같습니다: Observable 的实例时,它才会开始发布值。 订阅时要先调用可观察对象的 subscribe() 方法,并把一个观察者对象传给它,用来接收通知。如下:

为了展示订阅的原理,需要先创建新的可观察对象。它有一个构造函数可以用来创建新实例,但是为了更简明,也可以使用 Observable 上定义的一些静态方法来创建一些常用的简单可观察对象:

  • of(...items) :返回一个 Observable 实例,它用同步的方式把参数中提供的这些值一个一个发送出来。
  • from(iterable) : 把它的参数转换成一个 Observable 实例。 该方法通常用于把一个数组转换成一个(发送多个值的)可观察对象。
import { of } from "rxjs";
// 1、通过 of() 方法返回一个可观察对象,并准备将1,2,3三个数据发送出去
const observable = of(1, 2, 3);	
// 2、实现 observer 接口,观察者
const observer = {	
	next: (num: number) => console.log(num),
	error: (err: Error) => console.error('Observer got an error: ' + err),
  	complete: () => console.log('Observer got a complete notification'), 
}
// 3、订阅。调用可观察对象的 subscribe() 方法订阅,subscribe() 方法中传入的对象就是一个观察者
observable.subscribe(observer);
로그인 후 복사

运行结果如下:


上面订阅的写法可以直接改为如下:参数不是对象

observable.subscribe(
  num => console.log(num),
  err => console.error('Observer got an error: ' + err),
  () => console.log('Observer got a complete notification')
);
로그인 후 복사

订阅者函数

在上面的例子中使用的是of()方法来创建可观察对象,这节使用构造函数创建可观察对象。

Observable 构造函数可以创建任何类型的可观察流。 当执行可观察对象的 subscribe() 方法时,这个构造函数就会把它接收到的参数作为订阅函数来运行。 订阅函数会接收一个 Observer 对象,并把值发布给观察者的 next()方法。

// 1、自定义订阅者函数
function sequenceSubscriber(observer: Observer<number>) {
  observer.next(1);	// 发送数据
  observer.next(2);	// 发送数据
  observer.next(3);	// 发送数据
  observer.complete();
  return {unsubscribe() {}};
}

// 2、通过构造函数创建一个新的可观察对象,参数就是一个订阅者函数
const sequence = new Observable(sequenceSubscriber);

// 3、订阅
sequence.subscribe({
  next(num) { console.log(num); },	// 接受数据
  complete() { console.log(&#39;Finished sequence&#39;); }
});
로그인 후 복사

运行结果如下:

Angular의 관찰 가능한 객체, 관찰자 ​​및 RxJS 연산자에 대한 간략한 분석

上面一个例子演示了如何自定义订阅函数,那么既然可以自定义订阅者函数,我们就可以将异步代码封装进可观察对象的订阅者函数中,待异步代码执行完再发送数据。如下:

import { Observable } from &#39;rxjs&#39;
// 异步函数
function fn(num) {
    return new Promise((reslove, reject) => {
        setTimeout(() => {
            num++
            reslove(num)
        }, 1000)
    })
}
// 创建可观察对象,并传入订阅者函数
const observable = new Observable((x) => {
    let num = 1
    fn(num).then(
    	res => x.next(res)	// 异步代码执行完成,发送数据
    ) 
})
// 订阅,接收数据,可以改为链式调用
observable.subscribe(data => console.log(data))	// 2
로그인 후 복사

多播

https://angular.cn/guide/observables#multicasting

RxJS操作符

我们可以使用一系列的RxJS操作符,在这些消息被接收方接收之前,对它们进行一系列的处理、转换,因为这些操作符都是纯函数。

import { of } from &#39;rxjs&#39;;
import { map } from &#39;rxjs/operators&#39;;
// 1、创建可观察对象,并发送数据
const nums = of(1, 2, 3);
// 2、创建函数以接受可观察对象
const squareValues = map((val: number) => val * val);
const squaredNums = squareValues(nums);

squaredNums.subscribe(x => console.log(x));
로그인 후 복사

上面的方式我看不懂且难以接受,一般常用下面这种,使用pipe把多个操作符链接起来

import { map, Observable, filter } from &#39;rxjs&#39;

// 创建可观察对象,并传入订阅者函数
const observable = new Observable((x) => {
    x.next(1)
    x.next(2)
    x.next(3)
    x.next(4)
}).pipe(
    map(value => value*100),		// 操作符
    filter(value => value == 200)	// 操作符
)
.subscribe(data => console.log(data))	// 200
로그인 후 복사

错误处理

RxJS 还提供了catchError


구독 원칙을 입증하려면 먼저 새로운 관찰 가능한 객체를 생성해야 합니다. 여기에는 새 인스턴스를 생성하는 데 사용할 수 있는 생성자가 있지만 더 간결하게 하기 위해 Observable에 정의된 일부 정적 메서드를 사용하여 일반적으로 사용되는 간단한 관찰 가능 개체를 생성할 수도 있습니다.

    < li >of(...items): 매개변수에 제공된 값을 one by one으로 보내는 Observable 인스턴스를 반환합니다. 동기 방식이 나옵니다.
  • from(iterable) : 인수를 Observable 인스턴스로 변환합니다. 이 메서드는 일반적으로 배열을 관찰 가능한 개체(여러 값을 보내는)로 변환하는 데 사용됩니다.
import { map, Observable, filter, catchError, of } from &#39;rxjs&#39;

const observable = new Observable((x) => {
        x.next(1)	// 发送数据 1 和 2
        x.next(2)
}).pipe(
    map(value => {
        if (value === 1) {	// 1、当发送的数据为 1 时,将其乘以 100
            return value*100
        } else {	// 2、否则抛出错误
            throw new Error(&#39;抛出错误&#39;);
        }
    }),
    // 3、此处捕获错误并处理错误,对外发送数据 0
    catchError((err) => {
        console.log(err)
        return of(0)
    })
)
.subscribe(
    data => console.log(data),
    // 4、由于上面抛出的错误被 catchError 操作符处理(重新发送数据)了,所以这里能顺利订阅到数据而不报错
    err => console.log(&#39;接受不到数据:&#39;, err)
)
로그인 후 복사

실행 결과는 다음과 같습니다.

Angular의 관찰 가능한 객체, 관찰자 ​​및 RxJS 연산자에 대한 간략한 분석

위 구독은 다음과 같이 직접 변경할 수 있습니다. 매개변수가 객체가 아닙니다

rrreee구독자 함수

위 예에서 of() code> 메소드는 관찰 가능한 객체를 생성하는 데 사용됩니다. 이 섹션에서는 생성자를 사용하여 관찰 가능한 객체를 생성합니다. 🎜<blockquote>🎜<code>Observable 생성자는 모든 유형의 관찰 가능한 스트림을 생성할 수 있습니다. 관찰 가능한 객체의 subscribe() 메서드가 실행되면 이 생성자는 구독 함수로 수신하는 매개변수를 실행합니다. 구독 함수는 Observer 객체를 수신하고 해당 값을 관찰자의 next() 메서드에 게시합니다. 🎜rrreee🎜실행 결과는 다음과 같습니다. 🎜🎜🎜여기에 이미지 설명 삽입🎜🎜위의 예는 구독 기능을 사용자 정의하는 방법을 보여줍니다. 구독자 기능을 사용자 정의할 수 있으므로 관찰 가능한 객체의 구독자 함수에 비동기 코드를 캡슐화할 수 있습니다. , 데이터를 보내기 전에 비동기 코드가 실행될 때까지 기다리십시오. 다음과 같습니다: 🎜rrreee🎜Multicast🎜
🎜https://angular.cn/guide/observables#multicasting🎜
🎜RxJS 연산자🎜🎜일련의 RxJS 연산자 code>를 사용할 수 있습니다. , 이러한 메시지가 수신자에 의해 수신되기 전에 일련의 처리 및 변환이 수행됩니다. 왜냐하면 이러한 연산자는 순수 함수이기 때문입니다. 🎜rrreee🎜위의 방법은 이해가 안되고 받아들이기 어렵습니다. 일반적으로 여러 연산자를 연결하기 위해 <code>pipe를 사용하여 다음과 같은 방법을 사용합니다.🎜rrreee🎜오류 처리🎜🎜RxJS 파이프라인에서 알려진 오류를 처리할 수 있는 catchError 연산자도 제공됩니다. 🎜 API 요청을 하고 서버에서 반환된 응답을 매핑하는 관찰 가능 개체가 있다고 가정해 보세요. 서버가 오류를 반환하거나 값이 존재하지 않으면 오류가 생성됩니다. 이 오류를 포착하고 기본값을 제공하면 스트림은 오류를 보고하지 않고 해당 값을 계속 처리합니다. 🎜rrreee🎜최종 실행 결과는 다음과 같습니다. 🎜🎜🎜🎜🎜더 많은 프로그래밍 관련 지식을 보려면 🎜프로그래밍 비디오🎜를 방문하세요! ! 🎜
관찰자(관찰자) 관찰 가능한 객체(송신자)를 사용하면 관찰하려면 관찰자(수신자) )가 필요합니다. 관찰 가능한 객체는 observer 인터페이스를 구현해야 하며 다음과 같은 세 가지 속성을 포함합니다.

위 내용은 Angular의 관찰 가능한 객체, 관찰자 ​​및 RxJS 연산자에 대한 간략한 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Angular의 메타데이터와 데코레이터에 대해 이야기해 보겠습니다. Angular의 메타데이터와 데코레이터에 대해 이야기해 보겠습니다. Feb 28, 2022 am 11:10 AM

이 글은 Angular에 대한 학습을 ​​계속하고, Angular의 메타데이터와 데코레이터를 이해하고, 그 사용법을 간략하게 이해하는 데 도움이 되기를 바랍니다.

Ubuntu 24.04에 Angular를 설치하는 방법 Ubuntu 24.04에 Angular를 설치하는 방법 Mar 23, 2024 pm 12:20 PM

Angular.js는 동적 애플리케이션을 만들기 위해 자유롭게 액세스할 수 있는 JavaScript 플랫폼입니다. HTML 구문을 템플릿 언어로 확장하여 애플리케이션의 다양한 측면을 빠르고 명확하게 표현할 수 있습니다. Angular.js는 코드를 작성, 업데이트 및 테스트하는 데 도움이 되는 다양한 도구를 제공합니다. 또한 라우팅 및 양식 관리와 같은 많은 기능을 제공합니다. 이 가이드에서는 Ubuntu24에 Angular를 설치하는 방법에 대해 설명합니다. 먼저 Node.js를 설치해야 합니다. Node.js는 서버 측에서 JavaScript 코드를 실행할 수 있게 해주는 ChromeV8 엔진 기반의 JavaScript 실행 환경입니다. Ub에 있으려면

각도 학습 상태 관리자 NgRx에 대한 자세한 설명 각도 학습 상태 관리자 NgRx에 대한 자세한 설명 May 25, 2022 am 11:01 AM

이 글은 Angular의 상태 관리자 NgRx에 대한 심층적인 이해를 제공하고 NgRx 사용 방법을 소개하는 글이 될 것입니다.

Angular의 서버 측 렌더링(SSR)을 탐색하는 기사 Angular의 서버 측 렌더링(SSR)을 탐색하는 기사 Dec 27, 2022 pm 07:24 PM

앵귤러 유니버셜(Angular Universal)을 아시나요? 웹사이트가 더 나은 SEO 지원을 제공하는 데 도움이 될 수 있습니다!

Angular + NG-ZORRO로 백엔드 시스템을 빠르게 개발 Angular + NG-ZORRO로 백엔드 시스템을 빠르게 개발 Apr 21, 2022 am 10:45 AM

이 기사는 Angular의 실제 경험을 공유하고 ng-zorro와 결합된 angualr을 사용하여 백엔드 시스템을 빠르게 개발하는 방법을 배우게 될 것입니다. 모든 사람에게 도움이 되기를 바랍니다.

각도에서 monaco-editor를 사용하는 방법에 대한 간략한 분석 각도에서 monaco-editor를 사용하는 방법에 대한 간략한 분석 Oct 17, 2022 pm 08:04 PM

각도에서 모나코 편집기를 사용하는 방법은 무엇입니까? 다음 글은 최근 비즈니스에서 사용되는 Monaco-Editor의 활용 사례를 기록한 글입니다.

프론트엔드 개발에 PHP와 Angular를 사용하는 방법 프론트엔드 개발에 PHP와 Angular를 사용하는 방법 May 11, 2023 pm 04:04 PM

인터넷의 급속한 발전과 함께 프론트엔드 개발 기술도 지속적으로 개선되고 반복되고 있습니다. PHP와 Angular는 프런트엔드 개발에 널리 사용되는 두 가지 기술입니다. PHP는 양식 처리, 동적 페이지 생성, 액세스 권한 관리와 같은 작업을 처리할 수 있는 서버측 스크립팅 언어입니다. Angular는 단일 페이지 애플리케이션을 개발하고 구성 요소화된 웹 애플리케이션을 구축하는 데 사용할 수 있는 JavaScript 프레임워크입니다. 이 기사에서는 프론트엔드 개발에 PHP와 Angular를 사용하는 방법과 이들을 결합하는 방법을 소개합니다.

Angular의 독립 구성요소에 대한 간략한 분석 및 사용 방법 알아보기 Angular의 독립 구성요소에 대한 간략한 분석 및 사용 방법 알아보기 Jun 23, 2022 pm 03:49 PM

이 기사에서는 Angular의 독립 구성 요소, Angular에서 독립 구성 요소를 만드는 방법, 기존 모듈을 독립 구성 요소로 가져오는 방법을 안내합니다.

See all articles