2015-11-28 1 views
0

Я хочу, чтобы мое приложение ограничивало свои запросы сервером без сохранения данных. Есть ли способ сделать это без запроса на сервер каждый раз, когда вызывается мой HTTP-запрос? Каковы некоторые из различных методов, которые это может быть сделано, и лучшие практики/компромиссы для каждого?Как я могу использовать мой JSON без запуска нового запроса API каждый раз, когда я хочу использовать свои данные?

+0

вы говорите о получении JSON от сервера, а затем повторно использовать это без вызова сервера каждый раз? – sjokkogutten

+0

@sjokkogutten да я. Я знаю, что кеширование - это метод, но мне кажется, что более большая картина и как угловые обрабатывают запросы. Например, если служба делает запрос на ресурс, который загружается в контроллер, это служба, выполняющая HTTP-запрос каждый раз, когда вызываются контроллеры? Если это так, что может сделать много ненужных запросов – garrettmac

+0

Вы не говорите, что такое бэкэнд-система, или клиент. Я считаю, что это имеет значение. Например, с помощью бэкэнда Meteor.js вы получаете привязку данных n-way (если правильно закодировано), в то же время используя угловые или реагирующие на переднем конце. Если клиент является мобильным, имеет смысл использовать локальное хранилище, поскольку подключение может быть прерывистым. – brianlmerritt

ответ

0

Вы можете использовать опцию cache в config аргумент различных $http методов:

$http.get('/someUrl', { 
    cache: true 
}); 
0

Самый очевидный способ просто иметь целую переменную JavaScript, который подсчитывает, сколько запросов было сделано на сервер , и когда достигнут определенный максимальный предел, чтобы прекратить делать запросы на сервер.

Не зная больше о Почему вы хотите это сделать, трудно быть более конкретным.

2

Это будет зависеть от ваших потребностей. Один из подходов - хранить результаты в запросе на заводе и извлекать их.

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 
}; 
+0

Прежде всего, спасибо, что нашли время, чтобы ответить на мой вопрос, в настоящее время у меня довольно похожая настройка, но я использую сервис угловых сервисов 'как установленный на заводе, и я печатаю результат на моей консоли (это находится внутри моей служебной функции), и его регистрируется каждый раз, когда контроллер, который имеет введенную службу, вызывается (понятно), ergo делает запрос http каждый раз при каждом представлении который связан с контроллером, и вызывается служба.Поэтому мне было интересно, знаете ли вы - без кэширования - есть ли способ избежать этого? – garrettmac

+0

Хорошо. Независимо от того, используете ли вы услугу или завод, не следует иметь значения. Я отредактировал свой ответ, пытаясь сделать более понятным, как вы можете использовать сохраненный результат, чтобы избежать ненужных http-вызовов. – sjokkogutten

+0

Это очень полезно. спасибо – garrettmac