Будет ли интервал, который был передан по конвейеру, работать в Rx JS?
Вот что я имею в виду. Предположим, у нас есть следующий код:
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
и работает следующим образом:
- каждые 500 мс генерировать номер итерации (0, 1, 2, ...)
- использовать номер итерации для извлечения значения из
arr
- передавать извлеченное значение кому бы то ни было был подписан на метод
pipe
result - остановить выдачу номеров итераций, когда номер итерации больше, чем
arr.length
Таким образом, toRun.subscribe(val => val);
выдаст foo
, затем через 500 мс bar
и перестанет работать. Хотя i
никогда ничего не испускает, поскольку на него никто не подписался.
Я хочу понять, как это работает, поэтому, пожалуйста, исправьте мое объяснение, чтобы ответить на мой вопрос, если я ошибаюсь.
Я наткнулся на другой вопрос, работая с документацией Angular. Точнее через asyn c pipe . Я встретил там следующий пример:
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
создаст новый наблюдаемый и interval(500)
не будет использоваться явно, а только pipe
во время создания нового наблюдаемого).