Javascript-форум (https://javascript.ru/forum/)
-   Angular.js (https://javascript.ru/forum/angular/)
-   -   Где хранить данные, полученные от сервера? (https://javascript.ru/forum/angular/52924-gde-khranit-dannye-poluchennye-ot-servera.html)

desperado 13.01.2015 13:14

Где хранить данные, полученные от сервера?
 
Подскажите плз, как мне хранить данные, что бы каждый раз не делать к серверу ajax ($http) запросы. Делаю приложение, на бекенде есть куча апи, по которым я получаю определенные данные. Вот например я получаю ссылку на аватар юзера, как это сделать один раз при логине в приложении и при обновлении страницы не слать опять этот запрос?

Все обращения к апи сервера у меня сделаны в сервисах, потом использую данные в контроллерах. Как получать данные 1 раз от сервера и где то их записывать и каждый раз не слать лишние пост запросы на апи сервера? Подскажите плз.

Safort 13.01.2015 13:56

Используй LocalStorage или IndexedDB.

Shasoft 13.01.2015 15:17

Все зависит от количества таких данных. Можно просто сделать свой сервис, который будет иметь функцию по получению нужных данных. Результат ajax запроса кешировать в самом сервисе.
Если данных много, то, как писали выше. Но тут еще нужно понимать, что в этом случае данные на сервере и в, к примеру, LocalStorage могут быть не одинаковыми. Т.е. нужно будет их как-то синхронизировать при старте.

desperado 13.01.2015 15:19

а подскажите пример, как можно закешировать данные в сревисе? Это то, что нужно....данных не много, которые нужно получать один раз при логине юзера, это жсон массив объектов по сути...я думаю кеширование в сервисе то что нужно.

Shasoft 15.01.2015 09:17

Я вот так делаю
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;
	}]
);

desperado 19.01.2015 14:14

мне не очень понятно. я хочу закешировать данные, в момент, когда юзер залогинен, что бы не делать ненужные ajax запросы, в вашем же случае при обновлении страницы, естественно нет данных уже в кеше
и запрос отсылается все равно каждый раз.

Цитата:

Сообщение от Shasoft (Сообщение 351453)
Я вот так делаю
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;
	}]
);


Shasoft 20.01.2015 14:30

desperado,
Я кеширую данные в переменную m_dataCache.
Если вы замените её на LocalStorage или IndexedDB, то тогда лишние запросы делаться не будут


Часовой пояс GMT +3, время: 08:02.