Angular 2 Call Service только при инициализации приложения

Я пытаюсь вызвать внешний API только один раз для каждой инициализации приложения.

У меня простой сервис,

@Injectable()
export class XService {
    url = "http://api.example.com"
    constructor(private _http:Http) {

    }

    callAnAPI(){
        console.log('made an external request");
        return this._http.get(url)
            .map(res=>res.json());
    }
}

и два компонента, основной appComponent

@Component({
  selector: 'my-app',
  template: `
    <div>
      Test
    </div>
  `
})

export class AppComponent {
    isLoading = true;
    results = [];

    constructor(private _service: XService){

    }

    ngOnInit(){
        Observable.forkJoin(
            this._service.callAnAPI()
            // some more services here
        )
        .subscribe(
            res => {
                this.results = res[0];
            },
            null,
            () => {this.isLoading = false}
        );
    }
}

и другой компонент, используемый с маршрутом

@Component({
  template: `
    <div>
      I want to use the service with this component.
    </div>
  `
})

export class SecondComponent {

    constructor(private _service: XService){

    }
}

служба инициализируется и Angular обращается к серверу при инициализации AppComponent, Я хочу использовать XService с SecondComponent Кроме того, всякий раз, когда я пытаюсь снова вызвать службу из SecondComponent, (с помощью _service._service.callAnAPI()) Angular бьет по внешнему API. Я хочу минимизировать внешние хиты.

Как получить данные, сделанные AppComponent при инициализации, чем снова вызвать службу в SecondComponent

2 ответа

Решение

Вы могли бы использовать do Оператор для этого получает данные в первый раз и повторно использует их для следующих вызовов:

@Injectable()
export class XService {
  url = "http://api.example.com"
  constructor(private _http:Http) {

  }

  callAnAPI(){
    console.log('made an external request");
    if (this.cachedData) {
      return Observable.of(this.cachedData);
    } else {
      return this._http.get(url)
        .map(res=>res.json())
        .do((data) => {
          this.cachedData = data;
        });
    }
  }
}

Если вы хотите загрузить данные в качестве запуска, вы можете позвонить callAnAPI метод из сервисного конструктора.

Чтобы использовать этот подход, вам нужно определить свой сервис при загрузке приложения:

bootstrap(AppComponent, [ XService ]);

Таким образом, вы будете использовать один экземпляр для всего вашего приложения.

@Injectable()
export class XService {
    url = "http://api.example.com"
    constructor(private _http:Http) {

    }

    callAnAPI(){
      if(this.data) {
        return Observable.of(this.data);
      } else {
        console.log('made an external request");
        return this._http.get(url)
            .map(res=>res.json())
            .do(res => this.data = res);
      }
    }
}
Другие вопросы по тегам