13.01.2015, 13:14
|
Аспирант
|
|
Регистрация: 26.08.2014
Сообщений: 51
|
|
Где хранить данные, полученные от сервера?
Подскажите плз, как мне хранить данные, что бы каждый раз не делать к серверу ajax ($http) запросы. Делаю приложение, на бекенде есть куча апи, по которым я получаю определенные данные. Вот например я получаю ссылку на аватар юзера, как это сделать один раз при логине в приложении и при обновлении страницы не слать опять этот запрос?
Все обращения к апи сервера у меня сделаны в сервисах, потом использую данные в контроллерах. Как получать данные 1 раз от сервера и где то их записывать и каждый раз не слать лишние пост запросы на апи сервера? Подскажите плз.
|
|
13.01.2015, 13:56
|
|
Профессор
|
|
Регистрация: 23.12.2013
Сообщений: 1,856
|
|
Используй LocalStorage или IndexedDB.
|
|
13.01.2015, 15:17
|
|
Профессор
|
|
Регистрация: 03.03.2009
Сообщений: 156
|
|
Все зависит от количества таких данных. Можно просто сделать свой сервис, который будет иметь функцию по получению нужных данных. Результат ajax запроса кешировать в самом сервисе.
Если данных много, то, как писали выше. Но тут еще нужно понимать, что в этом случае данные на сервере и в, к примеру, LocalStorage могут быть не одинаковыми. Т.е. нужно будет их как-то синхронизировать при старте.
|
|
13.01.2015, 15:19
|
Аспирант
|
|
Регистрация: 26.08.2014
Сообщений: 51
|
|
а подскажите пример, как можно закешировать данные в сревисе? Это то, что нужно....данных не много, которые нужно получать один раз при логине юзера, это жсон массив объектов по сути...я думаю кеширование в сервисе то что нужно.
|
|
15.01.2015, 09:17
|
|
Профессор
|
|
Регистрация: 03.03.2009
Сообщений: 156
|
|
Я вот так делаю
App.factory('MyService',
[ '$document','$q','$timeout','$log','$http','$rootScope',
function($document , $q , $timeout , $log , $http , $rootScope )
{
// КЕШ загруженных данных
var m_dataCache = {};
// Сервис
var service = {
// Загрузка данных
load : function(userID) {
// Загрузка файлов
var deferred = $q.defer();
//
if( angular.isDefined(m_dataCache[userID]) )
{
// Вернуть данные из КЕШ-а
deferred.resolve(m_dataCache[userID]);
}
else
{
// Загружаем данные
$http.post("/getUserInfo.php", {id : userID}).then(function (result) {
// Запомнить в КЕШ
m_dataCache[userID] = result;
// Вернуть данные
deferred.resolve(result);
}
}, function (reason) {
// Вернуть ошибку
deferred.reject(reason);
}
);
}
return deferred.promise;
}
};
return service;
}]
);
|
|
19.01.2015, 14:14
|
Аспирант
|
|
Регистрация: 26.08.2014
Сообщений: 51
|
|
мне не очень понятно. я хочу закешировать данные, в момент, когда юзер залогинен, что бы не делать ненужные ajax запросы, в вашем же случае при обновлении страницы, естественно нет данных уже в кеше
и запрос отсылается все равно каждый раз.
Сообщение от Shasoft
|
Я вот так делаю
App.factory('MyService',
[ '$document','$q','$timeout','$log','$http','$rootScope',
function($document , $q , $timeout , $log , $http , $rootScope )
{
// КЕШ загруженных данных
var m_dataCache = {};
// Сервис
var service = {
// Загрузка данных
load : function(userID) {
// Загрузка файлов
var deferred = $q.defer();
//
if( angular.isDefined(m_dataCache[userID]) )
{
// Вернуть данные из КЕШ-а
deferred.resolve(m_dataCache[userID]);
}
else
{
// Загружаем данные
$http.post("/getUserInfo.php", {id : userID}).then(function (result) {
// Запомнить в КЕШ
m_dataCache[userID] = result;
// Вернуть данные
deferred.resolve(result);
}
}, function (reason) {
// Вернуть ошибку
deferred.reject(reason);
}
);
}
return deferred.promise;
}
};
return service;
}]
);
|
|
|
20.01.2015, 14:30
|
|
Профессор
|
|
Регистрация: 03.03.2009
Сообщений: 156
|
|
desperado,
Я кеширую данные в переменную m_dataCache.
Если вы замените её на LocalStorage или IndexedDB, то тогда лишние запросы делаться не будут
|
|
|
|