파이프 된 간격이 RxJS에서 실행됩니까?
제가 의미하는 바는 다음과 같습니다. 다음 코드가 있다고 가정 해 보겠습니다.
const arr = ["foo", "bar"];
const i = interval(500);
const toRun = i.pipe(
map(index => arr[index]),
take(arr.length)
);
toRun.subscribe(val => val);
코드가 다음과 같이 작동한다는 것을 올바르게 이해합니까?
1 i
이 생성되지만 구독 할 때까지 실행되지 않습니다.
2 pipe
방법 의 도움으로 우리 Observable
는에 구축 i
되고 다음과 같이 작동하는 새로운를 만듭니다 .
arr
pipe
메소드 결과를 구독 한 사람에게 추출 된 값을 내 보냅니다.arr.length
따라서 toRun.subscribe(val => val);
는 방출 foo
하고 500ms 후에 bar
실행을 중지합니다. (가) 동안 i
, 아무것도 방출하지 않습니다 아무도는에 가입하지 않았기 때문에.
나는 이것이 어떻게 작동하는지 이해하고 싶으므로 내가 틀렸다면 내 질문에 대답하기 위해 내 설명을 수정하십시오.
Angular 문서를 통해 작업하는 동안 다른 질문을 발견했습니다. 보다 구체적으로 비동기 파이프를 통해 . 나는 거기에서 다음 예를 만났다.
import { Component } from '@angular/core';
import { Observable, interval } from 'rxjs';
import { map, take } from 'rxjs/operators';
@Component({
selector: 'app-hero-message',
template: `
<h2>Async Hero Message and AsyncPipe</h2>
<p>Message: {{ message$ | async }}</p>
<button (click)="resend()">Resend</button>`,
})
export class HeroAsyncMessageComponent {
message$: Observable<string>;
private messages = [
'You are my hero!',
'You are the best hero!',
'Will you be my hero?'
];
constructor() { this.resend(); }
resend() {
this.message$ = interval(500).pipe(
map(i => this.messages[i]),
take(this.messages.length)
);
}
}
그리고 불필요한 실행으로 인해 성능 문제가 있는지 궁금합니다. interval(500)
( pipe
이는 새로운 Observable을 생성하고 interval(500)
명시 적으로 사용 하지 않을 것이기 때문에 pipe
새로운 Observable 생성 동안에 만 )
당신은 그것을 거의 정확하게 이해합니다. 몇 가지 참고 :
interval
생성하는 콜드 옵저버 블 을 생성합니다.pipe
그 자체로는 새로운 옵저버 블을 생성하지 않을 pipe
것입니다.map
그리고 눈 take
에 띄게 뜨겁게 만들지 마십시오. 그래도 여전히 춥고 구독 할 때만 "실행"됩니다.interval
처음에는 방출하기 전에 500ms를 기다립니다 foo
(구독 후).take
주어진 배출량 후에 관찰 가능한 소스에서 구독을 취소합니다. 이렇게하면 체인의 모든 Observable이 결국 interval
구독이 취소 될 때까지 소스 에서 구독을 취소합니다. 따라서 더 이상 숫자를 방출하지 않습니다.이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다