Я хочу, чтобы мое приложение ограничивало свои запросы сервером без сохранения данных. Есть ли способ сделать это без запроса на сервер каждый раз, когда вызывается мой HTTP-запрос? Каковы некоторые из различных методов, которые это может быть сделано, и лучшие практики/компромиссы для каждого?Как я могу использовать мой JSON без запуска нового запроса API каждый раз, когда я хочу использовать свои данные?
ответ
Вы можете использовать опцию cache
в config
аргумент различных $http
методов:
$http.get('/someUrl', {
cache: true
});
Самый очевидный способ просто иметь целую переменную JavaScript, который подсчитывает, сколько запросов было сделано на сервер , и когда достигнут определенный максимальный предел, чтобы прекратить делать запросы на сервер.
Не зная больше о Почему вы хотите это сделать, трудно быть более конкретным.
Это будет зависеть от ваших потребностей. Один из подходов - хранить результаты в запросе на заводе и извлекать их.
app.factory('DataService', function($http) {
var values;
var requestValues = function() {
$http.get("/api/getValues").then(
function(results){
values = results;
});
};
var getValues = function() {
return values;
};
return {
requestValues : requestValues, // this will make a http request and store the result
getValues: getValues // this will call the stored result (without making a http request)
}
});
А затем в вашем контроллере вызовите функции, чтобы сделать запрос для значений, а затем получите значения. Есть две функции, requestValues()
, чтобы сделать запрос http и сохранить результат, и getValues()
, чтобы получить сохраненные значения без запроса http. После вызова requestValues()
вы можете позвонить по номеру getValues()
из любого места, чтобы получить значения, не создавая новый HTTP-запрос.
myApp.controller('MyController', function ($scope, DataService) {
var init = function(){
DataService.requestValues(); // this will make the http request and store the result
$scope.items = DataService.getValues(); // this will get the result
};
var justGetValues = function(){
$scope.items = DataService.getValues(); // this will get the result (without making a http request)
};
});
Теперь вам просто нужно позвонить DataService.getUpdates();
всякий раз, когда вам понадобятся значения. (Возможно, вы захотите обернуть их в promise
. Я воздержался от этого из-за простоты)
Альтернативно вы можете использовать опцию кеша, как указано в @JLRishe. Угловой в $ HTTP имеет кэш встроенный, так просто установить кэш для истинно в опциях
$http.get(url, { cache: true})
.success(){
// on success
}.error(){
// on error
};
Прежде всего, спасибо, что нашли время, чтобы ответить на мой вопрос, в настоящее время у меня довольно похожая настройка, но я использую сервис угловых сервисов 'как установленный на заводе, и я печатаю результат на моей консоли (это находится внутри моей служебной функции), и его регистрируется каждый раз, когда контроллер, который имеет введенную службу, вызывается (понятно), ergo делает запрос http каждый раз при каждом представлении который связан с контроллером, и вызывается служба.Поэтому мне было интересно, знаете ли вы - без кэширования - есть ли способ избежать этого? – garrettmac
Хорошо. Независимо от того, используете ли вы услугу или завод, не следует иметь значения. Я отредактировал свой ответ, пытаясь сделать более понятным, как вы можете использовать сохраненный результат, чтобы избежать ненужных http-вызовов. – sjokkogutten
Это очень полезно. спасибо – garrettmac
вы говорите о получении JSON от сервера, а затем повторно использовать это без вызова сервера каждый раз? – sjokkogutten
@sjokkogutten да я. Я знаю, что кеширование - это метод, но мне кажется, что более большая картина и как угловые обрабатывают запросы. Например, если служба делает запрос на ресурс, который загружается в контроллер, это служба, выполняющая HTTP-запрос каждый раз, когда вызываются контроллеры? Если это так, что может сделать много ненужных запросов – garrettmac
Вы не говорите, что такое бэкэнд-система, или клиент. Я считаю, что это имеет значение. Например, с помощью бэкэнда Meteor.js вы получаете привязку данных n-way (если правильно закодировано), в то же время используя угловые или реагирующие на переднем конце. Если клиент является мобильным, имеет смысл использовать локальное хранилище, поскольку подключение может быть прерывистым. – brianlmerritt