Есть ли способ превратить нечистую трубу в чистую? - PullRequest
0 голосов
/ 03 мая 2019

Я новичок в 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, что я уже выполнил свою асинхронную задачу и не хочу запускать ее снова.

Я не разбираюсь в вещах, так что любые советы приветствуются.

1 Ответ

1 голос
/ 03 мая 2019

Краткий ответ: Нет, невозможно преобразовать его из нечистого в чистое.Тем не менее, ваш пример очень похож на приведенный в официальных документах :

import { HttpClient }          from '@angular/common/http';
import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'fetch',
  pure: false
})
export class FetchJsonPipe implements PipeTransform {
  private cachedData: any = null;
  private cachedUrl = '';

  constructor(private http: HttpClient) { }

  transform(url: string): any {
    if (url !== this.cachedUrl) {
      this.cachedData = null;
      this.cachedUrl = url;
      this.http.get(url).subscribe(result => this.cachedData = result);
    }

    return this.cachedData;
  }
}

Для чего это стоит, однако, в зависимости от вашего варианта использования, я бы переместил этот вызов всервис (в угловых сервисах есть синглтоны) и делятся результатом по всему приложению.Позже в документации, когда говорится о том, почему у них больше нет фильтра или порядка по трубе , в нем говорится: :

Любые возможности, которые вы бы поместили в канал и поделилисьчерез приложение можно записать в службу фильтрации / сортировки и вставить в компонент.

Опять же, это зависит от вашего варианта использования, но я надеюсь, что это поможет.

...