Я новичок в Angular 7, но я программирую AngularJS в течение нескольких лет. Мой вопрос основан на том факте, что при выполнении асинхронной задачи в канале (не обязательно вызов ajax, это может быть другая асинхронная задача), она должна быть объявлена нечистой.
Согласно Угловые документы :
Angular выполняет нечистую трубу во время каждого цикла обнаружения изменения компонента. Нечистый канал вызывается часто, так же часто, как каждое нажатие клавиши или движение мыши.
Это много вызовов, например, если вы используете один и тот же канал в таблице из 50 строк или в списке, попробуйте поместить console.log
, и вы увидите огромное количество раз, когда каждый канал выполняется снова и снова снова. Пример вызова ajax в нечистом канале:
import {Pipe, PipeTransform} from '@angular/core';
import {AnyService} from '../services/any.service';
@Pipe({
name: 'anyAjaxCall',
pure: false
})
export class AnyAjaxCallPipe implements PipeTransform {
private isDataCached = false;
private cachedData: string = null;
constructor(private anyService: AnyService) {
}
transform(value: any): string {
if (!this.isDataCached) {
this.isDataCached = true;
this.anyService
.read(value)
.subscribe((response: any) => {
this.cachedData = response.data.name;
}, (err: any) => {
this.isDataCached = false;
console.error(err);
});
}
return this.cachedData;
}
}
Зная выше, возможно ли преобразовать канал из нечистого в чистый после завершения асинхронной задачи? Я знаю, что есть возможность сохранить результат асинхронной операции в переменной как кэша и много раз избегая выполнения (как в примере кода выше), но я думаю, что было бы лучше с точки зрения производительности сказать Angular, что я уже выполнил свою асинхронную задачу и не хочу запускать ее снова.
Я не разбираюсь в вещах, так что любые советы приветствуются.