Я предоставляю HTTP-запрос GET через службу, а несколько компонентов используют эти данные (данные профиля у пользователя). Я хотел бы, чтобы первый запрос компонента фактически выполнял HTTP-запрос GET на сервер и кэшировал результаты, поэтому последующие запросы будут использовать кэшированные данные, а не снова звонить на сервер.результаты кэширования с помощью angular2 http service
Вот пример службы, как бы вы рекомендовали реализовать этот уровень кэша с помощью Angular2 и машинописного текста.
import {Inject, Injectable} from 'angular2/core';
import {Http, Headers} from "angular2/http";
import {JsonHeaders} from "./BaseHeaders";
import {ProfileDetails} from "../models/profileDetails";
@Injectable()
export class ProfileService{
myProfileDetails: ProfileDetails = null;
constructor(private http:Http) {
}
getUserProfile(userId:number) {
return this.http.get('/users/' + userId + '/profile/', {
headers: headers
})
.map(response => {
if(response.status==400) {
return "FAILURE";
} else if(response.status == 200) {
this.myProfileDetails = new ProfileDetails(response.json());
return this.myProfileDetails;
}
});
}
}
Я думаю, что вы ищете [доля] (https://github.com/Reactive-Extensions/RxJS/blob/master /doc/api/core/operators/share.md). У меня есть [plnkr] (http://plnkr.co/edit/hM4TSt4hlx4DA4xe37WU?p=preview), чтобы вы могли видеть его работу. Обратите внимание, что это не кеширование, но оно может работать для вас :) (запустите его один раз и просмотрите вкладку сети, а затем удалите '.share()' из 'http.get' и увидите разницу). –
Я пробовал ваш метод, но при вызове getUserProfile (с .share()) из двух разных компонентов запрос GET по-прежнему выполняется дважды на сервере. Это связано с тем, что ProfileService вводится в обоих конструкторах вызывающих компонентов, используя профиль @Inject (ProfileService) profileService. Что мне здесь не хватает? – Sagi
это зависит. Если вы вводите услугу в каждом компоненте, вы получаете два разных экземпляра (путем инъекции я имею в виду использование «providers/viewProviers»). Если это так, вы должны ввести его только в свой компонент верхнего уровня (между этими двумя). Если это не так, вы должны добавить больше кода и повторить, если это возможно. –